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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2010, 21:12   #1
Алёнушка
Новичок
Джуниор
 
Регистрация: 18.11.2010
Сообщений: 1
По умолчанию Паскаль. работа с арифметическим выражением

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

Код:
uses crt;
type stek = ^s;
  s = record
    data: string;
    n: integer;
    zn: integer;
    next: stek;
  end;

var
  i, j, k, c: integer;
  x, top, next: stek;
  str: string;

procedure Init(var top: stek); {inicializiryem}
begin
  top := nil;
end;

procedure In_stek(data: string; var top: stek); {dobavlyaem v stek }
var p: stek;
begin new(p);
  p^.data := data;
  p^.next := top;
  top := p;
end;

procedure Out_stek(var data: string; var top: stek); {vinimaem iz steka}
var p: stek;
begin data := top^.data;
  p := top;
  top := top^.next;
  dispose(p);
end;

begin
  clrscr;
  i := 0;
{ str:='((a+b)*(c-d)+e*g)';}

  writeln('VVedite Viragenie vida(....):');
  readln(str); {schitali stroky}
  k := length(str); {opredelyaem ee dlinny}
  Init(top);
  while i < k do
  begin
    In_Stek(Str[k - i], Top);
    i := i + 1;
  end;
  X := Top;
  j := 0;

  while x <> nil do
  begin
    if x^.data = '(' then j := j + 1;
    x := x^.next;
  end;


  x := top;
  while j <> 1 do {vipisivaem vse virajeniya v skobkah}
  begin

    while c <> j do
    begin
      if x^.data = '(' then c := c + 1;
      x := x^.next;
    end; {dohli do samoi pravoi skobki '('}

    while x^.data <> ')' do
    begin
      x^.zn := 1;
      write(x^.data);
      x := x^.next;
    end;
    writeln;
    j := j - 1;
    c := 0;
    x := top;
  end;
  j := 0;
  x := top;
  while x <> nil do
  begin
    if (((x^.data = '*') or (x^.data = '/')) and (x^.zn <> 1))
      then
    begin
      writeln(x^.data);
    end;
    x := x^.next;
  end;

  x := top;
  while x <> nil do
  begin
    if (((x^.data = '-') or (x^.data = '+')) and (x^.zn <> 1))
      then
    begin
      writeln(x^.data);
    end;
    x := x^.next;
  end;
________________
впредь не забывайте использовать значок # (тэг [CODE] ..[/СODE])
для оформления кода!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 18.11.2010 в 21:51.
Алёнушка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с регулярным выражением ssdm PHP 14 25.02.2010 12:55
Проблема с регулярным выражением ssdm PHP 3 12.01.2010 18:26
проблема со "средним арифметическим" MyQwErTy Помощь студентам 15 19.02.2009 14:18