• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Динамические переменные. Free Pascal

  • Автор темы Автор темы Léon1
  • Дата начала Дата начала

Léon1

С# - learn or die
Поддержка
Регистрация
17 Дек 2011
Сообщения
2,438
Реакции
178
Баллы
0
Динамические переменные. Free Pascal

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

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

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

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

По определению полагают 0!! = 1.
 
Нашла на просторах интернета похожую задачу:
Многочлен 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) совсем ничего непонятно.
 
тип памяти мне кажется уместно будет использовать byte, т.к. работаем с памятью
Бред, мы не знаем, какие именно значения коэффициентов надо хранить в динамическом массиве, поэтому ограничение отрезком [0;255] просто недопустимо.
Для коэффициентов определим тип массива целочисленный Integer, он допускает как положительные, так и отрицательные и нулевые значения.
Для хранения членов многочлена используем тип longint, он позволяет использовать достаточно большие значения при вычислениях.
процедуру PRINT(P, S), которая выводит P как многочлен от переменной, равной коду символьной переменной S.
Думаю, речь идет о значении х, равном chr-коду символа, хранящегося в S. То есть нужно сначала запросить с клавиатуры ввод символа S, получить его chr-код и передать его функции в качестве значения переменной x. Затем вычислить значение многочлена с этим x.
 
Начало можно взять из найденного вами листинга, удалив из него лишние многочлены
Многочлен 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), внеся в него незначительные изменения :))
 
Я что-то тут намудрила, исправьте пожалуйста.
Код:
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.
 
Мда, действительно, намудрила :))
 
Я что-то тут намудрила, исправьте пожалуйста.
Ох, Анжелика - достали-таки с этими "динамиками"!
Ну а вот что я "намудрил". Хотя честно предупреждал - в динамических размещениях я, по большому счету "не копенгаген" :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), ну или задавайте нулевые коэффициенты при больших степенях, а то рискуете вылететь за разрядную сетку.
 
Спасибо!!!
 
Владимир, я все-таки думаю, что моя расшифровка задачи не вполне корректна, скорее всего надо вывести не результат вычисления полинома, а его самого, естественно, со всеми коэффициентами, а в качестве аргумента надо выводить символ, хранящийся в переменной S.
 
Владимир, я все-таки думаю, что моя расшифровка задачи не вполне корректна, скорее всего надо вывести не результат вычисления полинома, а его самого, естественно, со всеми коэффициентами, а в качестве аргумента надо выводить символ, хранящийся в переменной S.
Лёша, это-то не проблема, вывести можно что угодно, хоть коэффициенты полинома, хоть степени кода, хоть и то, и другое (кстати, я не руководствовался Вашей инструкцией, а просто писал, как понимаю). Тут в другом заковыка - как эти чертовы адреса с нулевыми коэффициентами исключить. Похоже, надо делать структуру вроде списка или стека, а я в этом, ну, как бы это помягче... Вот.
 
если ^p=0 то переход к следующему :)
Если честно, из-за дефицита времени я накидал самый примитивный вариант, не думаю, что там нужно нечто профессиональное, судя по всему, уровень не тот.
 
если ^p=0 то переход к следующему
Чудесно. Но как потом сопоставлять номер коэффициента и показатель степени аргумента полинома? Или вводить вспомогательный массив (тоже динамический!), где хранить номера слагаемых (степеней)?
 
Назад
Сверху