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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2016, 19:11   #1
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию Написать нерекурсивную функцию вычисления выражения, используя стек

Написать не рекурсивную функцию, которая используя стек, вычисляет значение F(m,n) для любой пары положительных чисел n и m за соотношением:
latex.gif
Я не мог понять даже задания, преподаватели всегда отмахивались и мне на форме помогли написать код, но я так и не понял задания и поэтому не могу понять правильный ли код или нет. Так же в коде не понятно почему нельзя ввести 0 значения для переменных. Буду очень благодарен за разъяснения по коду и помощь. Заранее огромное спасибо.
Код:
Код:
type TStack = ^Stack;
     Stack = record
               x: longint;
               next: TStack
             end;
 
procedure cr(s: string; var x: longint);
begin
  repeat
    write(s, ' > 0;  ', s, ' = ');
    readln(x)
  until x > 0
end;
 
procedure push(var st: TStack; t: longint);
var tmp: TStack;
begin
  new(tmp);
  tmp^.x := t;
  tmp^.next := st;
  st := tmp
end;
 
procedure pop(var st:TStack; var t: longint);
var tmp: TStack;
begin
  t := st^.x;
  tmp := st;
  st := st^.next;
  dispose(tmp)
end;
 
var m, n: longint;
    st: TStack;
 
begin
  cr('m', m);
  cr('n', n);
  push(st, m);
  while st <> nil do
    begin
      pop(st, m);
      if (m = 0) or (n = 0)
        then n := m + n + 1
        else begin
          dec(m);
          push(st, m);
          inc(m);
          push(st, m);
          dec(n)
        end;
    end;
  writeln('f(m, n) = ', n);
  readln
end.
Max00766 вне форума Ответить с цитированием
Старый 29.03.2016, 19:28   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

была же уже тема и там все описали
p51x на форуме Ответить с цитированием
Старый 29.03.2016, 19:42   #3
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
была же уже тема и там все описали
Не могу понять почему 0 не принимает
Max00766 вне форума Ответить с цитированием
Старый 29.03.2016, 19:45   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Не принимает ноль, потому что по условию числа должны быть положительными. Ну или измените условие "x > 0" в процедуре cr, если так хочется нули ввести.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 29.03.2016, 20:07   #5
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не принимает ноль, потому что по условию числа должны быть положительными. Ну или измените условие "x > 0" в процедуре cr, если так хочется нули ввести.
Но в условии есть же m*n=0, а такое возможно же только если одно из слагаемых будет = 0
А вообще программа написана правильно, стоит дальше разбираться с ней, просто что бы зря не потратил время на нее?

Последний раз редактировалось Max00766; 29.03.2016 в 20:10.
Max00766 вне форума Ответить с цитированием
Старый 29.03.2016, 21:22   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

В условии сказано "вычисляет значение F(m,n) для любой пары положительных чисел n и m". "такое возможно же только если одно из слагаемых будет = 0" - согласен. Да, программа похожа на верную. Но время советую потратить и разобраться с рекурсией (тогда бы и желания ввести нули не было).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 29.03.2016, 22:08   #7
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В условии сказано "вычисляет значение F(m,n) для любой пары положительных чисел n и m". "такое возможно же только если одно из слагаемых будет = 0" - согласен. Да, программа похожа на верную. Но время советую потратить и разобраться с рекурсией (тогда бы и желания ввести нули не было).
Спасибо, просто все форумы штурмую, так как самому сложно разобраться, а в универе курсач дали, 10 минут про стеки рассказали и сказали делайте и что бы прогу уже показывали. Пытаюсь найти помощь где только могу
Max00766 вне форума Ответить с цитированием
Старый 31.03.2016, 18:21   #8
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Кто-то может перевести код программы из Паскаля в Си?
Код:
type TStack = ^Stack;
     Stack = record
               x: longint;
               next: TStack
             end;
 
procedure cr(s: string; var x: longint);
begin
  repeat
    write(s, ' > 0;  ', s, ' = ');
    readln(x)
  until x > 0
end;
 
procedure push(var st: TStack; t: longint);
var tmp: TStack;
begin
  new(tmp);
  tmp^.x := t;
  tmp^.next := st;
  st := tmp
end;
 
procedure pop(var st:TStack; var t: longint);
var tmp: TStack;
begin
  t := st^.x;
  tmp := st;
  st := st^.next;
  dispose(tmp)
end;
 
var m, n: longint;
    st: TStack;
 
begin
  cr('m', m);
  cr('n', n);
  push(st, m);
  while st <> nil do
    begin
      pop(st, m);
      if (m = 0) or (n = 0)
        then n := m + n + 1
        else begin
          dec(m);
          push(st, m);
          inc(m);
          push(st, m);
          dec(n)
        end;
    end;
  writeln('f(m, n) = ', n);
  readln
end.
Max00766 вне форума Ответить с цитированием
Старый 31.03.2016, 19:44   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Осталось дописать код в функции:
Код:
#include <stdio.h>
#include <stdlib.h>

typedef struct Stack {
    int x;
    struct Stack *next;
} Stack;
typedef Stack* TStack;

void cr(char *s, int *x)
{
    //...
}

void push(TStack *st, int t)
{
    //...
}

void pop(TStack *st, int *t)
{
    //...
}

int main(void)
{
    int m, n;
    TStack st = NULL;
    //...
    printf("f(m, n) = %d\n", n);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 01.04.2016, 15:52   #10
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Осталось дописать код в функции:
Код:
#include <stdio.h>
#include <stdlib.h>

typedef struct Stack {
    int x;
    struct Stack *next;
} Stack;
typedef Stack* TStack;

void cr(char *s, int *x)
{
    //...
}

void push(TStack *st, int t)
{
    //...
}

void pop(TStack *st, int *t)
{
    //...
}

int main(void)
{
    int m, n;
    TStack st = NULL;
    //...
    printf("f(m, n) = %d\n", n);
    return 0;
}
А где можно найти аналогии стандартных функций паскаля в Си?
Max00766 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать не рекурсивную функцию, используя стек Max00766 Общие вопросы C/C++ 12 21.03.2016 06:47
Составить рекуррентную функцию вычисления выражения. Pascal AngryProj Помощь студентам 5 27.11.2014 21:37
Используя очередь, написать процедуру или функцию,для вычисления среднего геометрического элементов типизированного файла (Паскаль BumBum4ik Помощь студентам 0 04.01.2014 18:12
Вычислить выражение , используя функцию вычисления. Roman1295 Паскаль, Turbo Pascal, PascalABC.NET 0 23.12.2012 18:22