Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Динамические переменные. Free Pascal (http://www.tehnari.ru/f41/t81063/)

Léon 25.11.2012 20:33

Динамические переменные. Free Pascal
 
Помогите, пожалуйста, создать программу.
Многочлен P(x) = a0 + a1 x + a2 x2 + ... + an xn с целыми коэффициентами представьте в динамической памяти. При этом, если ai=0, то соответствующий член не включать в память. Создайте подходящий тип данных и определите следующие процедуры и функции для работы с такими многочленами:
процедуру PRINT(P, S), которая выводит P как многочлен от переменной, равной коду символьной переменной S.

Gruvi 27.11.2012 01:36

у тип памяти мне кажется уместно будет использовать byte, т.к. работаем с памятью.

Ну у меня наклевывается 2 варианта, даже 3. хотя даже 4
арифметическая прогрессия
геометрическая прогрессия
факториал (либо двойной факториал)
Из выш.мата. - Ряды...

Двойной факториал числа n обозначается n!! и определяется как произведение всех натуральных чисел в отрезке [1,n], имеющих ту же чётность что и n. Таким образом,

(2k)!! = 2*4*6*8 и т.п.
(2k+1)!! = 1*3*5*7 и т.п.

По определению полагают 0!! = 1.

Léon 27.11.2012 05:10

Нашла на просторах интернета похожую задачу:
Многочлен P(x) = a0 + a1 x + a2 x2 + ... + an xn. Q(x)=b0 + b1 x + b2 x2 + ... + bn xn с целыми коэффициентами представьте в динамической памяти. При этом, если ai=0, bi=0 то соответствующий член не включать в память.
процедуру RAZ(P, Q, R), которая строит многочлен R, как разность многочленов Q и P.
Код:

program din;
 type intmas=array [1..1000] of integer;
 var P,Q,R: ^intmas;
 i,k,n,z,a,g,w:integer;
 c,t:integer;
 begin
 new(P);
 new(Q);
 new(R);
 writeln('vvedite kolichestvo slagaemyh mnogochlena Q[X]');
 readln(n);
 for k:=1 to n do begin
 q^[k]:=(n-1);
 end;
 for i:=1 to n do
 begin
 write('vvedi kofficient pri x^',i-1,'=');
 readln(q^[i]);
 end;
  writeln('vvedite kolichestvo slagaemyh mnogochlena P[X]');
 readln(a);
  for z:=1 to a do begin
 p^[z]:=(a-1);
 end;
 for w:=1 to a do
 begin
 write('vvedi kofficient pri x^',w-1,'=');
readln(p^[w]);
 end;
 if n=a then begin
 for i:=n downto 1 do
 write(q^[i],'x^',i-1,'+');
 writeln;
 for i:=a downto  1 do
 write(p^[z],'x^',i-1,'+');
  writeln;
  writeln('------------------------');
 for i:=a downto 1 do begin
 r^[i]:=q^[i]-p^[z];
 write(r^[i],'x^',i-1,'+'); end;end;
 if n>a
 then begin
  for i:=n downto 1 do
 write(q^[i],'x^',i-1,'+');
 writeln;
 for i:=a downto  1 do
 write(p^[z],'x^',i-1,'+');
  writeln;
  writeln('------------------------');
 
  for i:=n downto  1 do
    if i>a then begin
      write(q^[i],'x^',i-1,'+'); end
          else
          for i:=a downto 1 do begin
    r^[i]:=q^[i]-p^[z];
    write(r^[i],'x^',i-1,'+');
 end;
 end;
 if a>n
 then begin
  for i:=a downto 1 do
 write(p^[z],'x^',i-1,'+');
 writeln;
 for i:=n downto  1 do
 write(q^[i],'x^',i-1,'+');
  writeln;
  writeln('------------------------');
 
  for i:=a downto  1 do
    if i>n then begin
      write(p^[z],'x^',i-1,'+'); end
          else
          for i:=n downto 1 do begin
    r^[i]:=p^[z]-q^[i];
    write(r^[i],'x^',i-1,'+');
 end;
 end;
 end.

А вот с реализацией моей процедуры PRINT(P, S) совсем ничего непонятно.

AlexZir 27.11.2012 17:36

Цитата:

Сообщение от Gruvi (Сообщение 824929)
тип памяти мне кажется уместно будет использовать byte, т.к. работаем с памятью

Бред, мы не знаем, какие именно значения коэффициентов надо хранить в динамическом массиве, поэтому ограничение отрезком [0;255] просто недопустимо.
Для коэффициентов определим тип массива целочисленный Integer, он допускает как положительные, так и отрицательные и нулевые значения.
Для хранения членов многочлена используем тип longint, он позволяет использовать достаточно большие значения при вычислениях.
Цитата:

Сообщение от 11Angelav (Сообщение 824183)
процедуру PRINT(P, S), которая выводит P как многочлен от переменной, равной коду символьной переменной S.

Думаю, речь идет о значении х, равном chr-коду символа, хранящегося в S. То есть нужно сначала запросить с клавиатуры ввод символа S, получить его chr-код и передать его функции в качестве значения переменной x. Затем вычислить значение многочлена с этим x.

AlexZir 28.11.2012 18:17

Начало можно взять из найденного вами листинга, удалив из него лишние многочлены
Цитата:

Сообщение от 11Angelav (Сообщение 824183)
Многочлен P(x) = a0 + a1 x + a2 x2 + ... + an xn с целыми коэффициентами представьте в динамической памяти. При этом, если ai=0, то соответствующий член не включать в память. Создайте подходящий тип данных и определите следующие процедуры и функции для работы с такими многочленами: процедуру PRINT(P, S), которая выводит P как многочлен от переменной, равной коду символьной переменной S.

Код:

program din; 
type intmas=array [1..1000] of integer;  {определяем тип динамического массива}
var P: ^intmas;  {определяем динамическую переменную для хранения массива}
i,k:integer; 
s:char;
{сюда вставьте процедуру PRINT}
begin 
new(P); {создаем динамический массив в памяти}
writeln('Input symbol');  {запрашиваем ввод символа для указания его в качестве аргумента многочлена}
readln(s);
writeln('vvedite kolichestvo slagaemyh mnogochlena P[',s,']');  {запрашиваем количество членов многочлена}
readln(n); 
{инициализируем динамический массив в памяти, присваивая ему начальные  значения, без этого вполне можно обойтись, но дальнейшая работа с массивом может быть затруднена из-за особенностей компилятора да и от мусора в выделенной памяти избавит}
for i:=1 to n do begin  P^[i]:=0;  end; 
{заполняем массив коэффициентами}
for i:=1 to n do 
  begin 
    write('vvedi kofficient pri ',s,'^',i-1,'='); 
    readln(p^[i]);  {считываем с клавиатуры очередной коэффициент и помещаем его в массив в памяти}
  end;
PRINT(S);
readln
end.

Теперь вам остается реализовать только процедуру вывода многочлена, при этом также можно воспользоваться найденным вами листингом в части вывода многочлена R(X), внеся в него незначительные изменения :))

Léon 04.12.2012 08:17

Я что-то тут намудрила, исправьте пожалуйста.
Код:

program din; 
type intmas=array [1..1000] of integer; 
var P: ^intmas; 
i,k,n:integer; 
S,x:char;
procedure PRINT(P,S: Mnogochlen; var S:Mnogochlen);
Begin
    write('Введите символ: ');readln(S);
    write('Символ "',S,'" имеет номер в кодовой таблице = ',ord(S));
end;
function
begin
readln(n, x);
P := 0;
for i := 1 to n + 1 do begin
read(a);
x:=ord(S);
P := P * x + a
end;
writeln(P:4:2)
End;

begin 
new(P);
writeln('Input symbol');
readln(s);
writeln('vvedite kolichestvo slagaemyh mnogochlena P[',s,']'); 
readln(n); 
for i:=1 to n do begin  P^[i]:=0;  end; 
for i:=1 to n do 
  begin 
    write('vvedi kofficient pri ',s,'^',i-1,'='); 
    readln(p^[i]); 
  end;
PRINT(S);
readln
end.


AlexZir 04.12.2012 09:35

Мда, действительно, намудрила :))

Vladimir_S 04.12.2012 10:04

Цитата:

Сообщение от 11Angelav (Сообщение 828446)
Я что-то тут намудрила, исправьте пожалуйста.

Ох, Анжелика - достали-таки с этими "динамиками"!
Ну а вот что я "намудрил". Хотя честно предупреждал - в динамических размещениях я, по большому счету "не копенгаген" :D. А потому вот это требование: "При этом, если ai=0, то соответствующий член не включать в память" выше моего разумения - тут надо вводить "обратные связи", перелопачивать адресацию и пр. Нет уж, увольте. Ну а так, без этого, вроде работает:
Код:

{$R-}
type
 intmas=array [0..0] of integer;
 T=^intmas;
 B=^Byte;
var
 a:T;
 i,k,N:integer;
 x:B;
 S:char;

Function P(z:B; c:T; M:Integer):Real;
Var
 q:Integer;
 R,D:real;
begin
 R:=c^[0];
 D:=1;
 For q:=1 to M do
  begin
  D:=D*z^;
  R:=R+c^[q]*D;
  end;
 P:=R;
end;

Begin
 Write('N= ');
 Readln(N);
 GetMem(a, SizeOf(Integer)*(N+1));
 For i:=0 to N do
  begin
  Write('a[',i,']= ');
  Readln(a^[i]);
  end;
 New(x);
 Write('Enter the symbol: ');
 Readln(S);
 x^:=Ord(S);
 Writeln('P= ',P(x,a,N):0:3);
 FreeMem(a, SizeOf(Integer)*(N+1));
 Dispose(x);
 Readln;
End.

Замечание: поскольку коды символов - трехзначные числа, большие степени полинома не ставьте, ограничьтесь N=(2-3), ну или задавайте нулевые коэффициенты при больших степенях, а то рискуете вылететь за разрядную сетку.

Léon 04.12.2012 14:03

Спасибо!!!

AlexZir 04.12.2012 18:32

Владимир, я все-таки думаю, что моя расшифровка задачи не вполне корректна, скорее всего надо вывести не результат вычисления полинома, а его самого, естественно, со всеми коэффициентами, а в качестве аргумента надо выводить символ, хранящийся в переменной S.


Часовой пояс GMT +4, время: 04:11.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.