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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2012, 03:34   #1
rublyabachka
Пользователь
 
Аватар для rublyabachka
 
Регистрация: 12.12.2011
Сообщений: 31
По умолчанию Стек и структура в Delphi 7

Задание звучит так:
СОСЕДИ, что означает, являются ли соседями элементы X и Y списка L.
Написала программу но почему-то в стек она даже не заходит... не могу разобраться почему. может подскажете что?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

  type
  TForm1 = class(TForm)
    Vvod: TEdit;
    Px: TEdit;
    Py: TEdit;
    Proverka: TButton;
    Result: TLabel;
    procedure ProverkaClick(Sender: TObject);

  private

  public
    { Public declarations }
  end;

type
  Stack = ^Elem;
  Elem = Record
    info : string;
    next : Stack;
end;

var
  Form1: TForm1;
  i, flag: integer;
  Stc : Stack;
  znach:string;

implementation

{$R *.dfm}

// Добавляем в стек
procedure push(Stc: Stack; item: string);
var
  new_item: Stack;
begin
  New(new_item);
  new_item^.info := item;
  new_item^.next := Stc;
  Stc := new_item;
end;

//Удаление стека из памяти.
function pop(Stc: Stack):string;
var
old_item: Stack;
old_info:string;
begin
old_item:=Stc;
old_info:='';
if Stc <> nil then
 begin
old_info:=old_item^.info;
Stc:=Stc^.next;
dispose(old_item);
Result:=old_info;
end
else
  Result := '';
end;

// Достаём верхний элемент стека
function peek(Stc: Stack):string;
begin
 if Stc <> nil then
  Result := Stc^.info
 else
  Result := '';
end;

procedure TForm1.ProverkaClick(Sender: TObject);
begin
  flag:=0;
  Result.Caption:='';
  znach:='';
  if (length(Vvod.Text)<>0) and (length(Px.Text)=1) and (length(Py.Text)=1) then
  begin
    for i:=1 to length(Vvod.Text) do
    begin
      push(Stc,Vvod.Text[i]);
    end;
      while Stc<>nil do
      begin
      znach:= pop(Stc);
        if  znach= Px.Text[1] then
        begin
          if peek(Stc)=Py.Text[1] then
          flag:=1;
        end;
        if znach=Py.Text[1] then
        begin
          if peek(Stc)=Px.Text[1] then
            flag:=1;
        end;
      end;
      if flag=1 then
        Result.Caption:='Элементы являются соседями'
      else
      Result.Caption:='Элементы не являются соседями';
  end
  else
  Result.Caption:='Не верно заполнены поля';
  pop(Stc);
end;

end.
Вложения
Тип файла: zip Лабораторная работа №4.zip (194.6 Кб, 7 просмотров)
rublyabachka вне форума Ответить с цитированием
Старый 10.07.2012, 11:22   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

1.
Цитата:
Задание звучит так:
СОСЕДИ, что означает, являются ли соседями элементы X и Y списка L.
Вместе с тем, Вы рассматриваете
Цитата:
Стек и структура в Delphi 7
Так думаю, что это разные понятия структур. С этим надо как-то определиться.

2. При формировании стека необходимо инициализировать вершину стека.
Код:
Stc := Nil;
3. // Добавляем в стек
Код:
procedure push(Stc: Stack; item: string);
var
  new_item: Stack;
begin
  New(new_item);
  new_item^.info := item;
If Stc = Nil Then {Для первого элемента стека}
  new_item^.next := Nil
Else
  new_item^.next := Stc;
  Stc := new_item;
end;
4. СОСЕДИ, как я понял, это когда в одном элементе списка есть ссылка на второй элемент. Т.е. по заданному тексту ищется элемент. Затем, по заданному второму тексту, ищется другой элемент и надо проверить, ссылается ли один из найденных элементов на второй?
Это правильно понято? Но у Вас сравниваются тексты
Или что-то не так понято?

5. Вам необходимо сформировать другие процедуры и функции.
О работе со списками неплохо, и с примерами процедур и функций, изложено у Т.А. Павловской, Программирование на ЯВУ. Паскаль. Электронная версия выложена в разделе литературы (см. в конце раздела).

Как-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.07.2012, 12:36   #3
rublyabachka
Пользователь
 
Аватар для rublyabachka
 
Регистрация: 12.12.2011
Сообщений: 31
По умолчанию

Спасибо!
На счет задания: мы ищем один элемент если он равен 1 соседу, а затем проверяем следующий за ним и приравниваем второму соседу. На деле это выглядит так:
стек: птасповщш
1ый сосед: с
2ой сосед: п
результат: элементы соседи

может мне кто-нибудь подскажет, что тут
Код:
 old_info:=old_item^.info;
не так?

Последний раз редактировалось rublyabachka; 10.07.2012 в 13:46.
rublyabachka вне форума Ответить с цитированием
Старый 11.07.2012, 12:34   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

Кажется разобрался
И так. Вводим текст и два символа. Надо проверить, являются эти символы соседями во введенном тексте.
Ваши ошибки состоят в том, что неправильно оформлены функции push и pop.
Так, например:
Код:
procedure push(Stc: Stack; item: string);
var
  new_item: Stack;
begin
  New(new_item);
  new_item^.info := item;
  new_item^.next := Stc;
  Stc := new_item; // Но Stc передано по значению :(
end;
Посмотрите во вложении. Логика Вашего решения не переписывалась. Внесены только исправления, связанные с изменением п/п Push и Pop.

Как-то так ...
Вложения
Тип файла: rar Лабораторная4.rar (167.7 Кб, 3 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.07.2012, 00:44   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

Посмотрел алгоритм и поправил:
- Исправил условие для цикла While;
- Изменил логику проверки ...
- ...


Так вроде лучше ...
Вложения
Тип файла: rar Лабораторная4.rar (167.9 Кб, 11 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.07.2012, 00:55   #6
rublyabachka
Пользователь
 
Аватар для rublyabachka
 
Регистрация: 12.12.2011
Сообщений: 31
По умолчанию

спасибо вам большое но я уже все сделала и разобралась...
мне очень жаль, что я бессмысленно отняла у вас ваше время!
вот что получилось у меня:
Вложения
Тип файла: zip Лабораторная работа №4.zip (247.1 Кб, 13 просмотров)
rublyabachka вне форума Ответить с цитированием
Старый 12.07.2012, 01:33   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

Все нормально. И то, что у Вас все получилось - прекрасно.
Немного замечаний:
Переменные, которые нужны только в п/п лучше там и описывать, а не делать их глобальными.
Поскольку в цикле только один оператор, то и begin/end там ни к чему.
Т.к. в условном операторе мы проверяем то что введенные элементы составляют только один байт, то и писать, например, Px.text[1] не стоит.
Ну там еще по мелочи можете увидеть в коде.


Ну, в общем, где то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стек в Delphi! Kate23 Помощь студентам 1 14.03.2012 16:26
Создать компонент Delphi стек Graff Valdemar Помощь студентам 3 20.05.2010 20:19
Стек в Delphi antyan Помощь студентам 1 30.04.2010 17:48
Стек и очередь. (Delphi) Olgasato Помощь студентам 8 02.04.2010 08:08
Стек в Delphi Vladimir-888 Помощь студентам 0 01.04.2010 18:46