Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 25.11.2012, 20:33   #1 (permalink)
Léon
С# - learn or die
 
Аватар для Léon
 
Регистрация: 17.12.2011
Сообщений: 2,438
Записей в дневнике: 8
Сказал(а) спасибо: 21
Поблагодарили 49 раз(а) в 11 сообщениях
Репутация: 19701
По умолчанию Динамические переменные. Free Pascal

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

Старый 25.11.2012, 20:33
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Потратьте немного времени на прочтение подобных обсуждений

Free Pascal, помогите сделать задачу
Использование библиотеки модуля GRAPH. Free Pascal

Старый 27.11.2012, 01:36   #2 (permalink)
Gruvi
VIP user
 
Аватар для Gruvi
 
Регистрация: 10.03.2011
Сообщений: 765
Записей в дневнике: 1
Сказал(а) спасибо: 10
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3453
По умолчанию

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

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

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

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

По определению полагают 0!! = 1.
Gruvi вне форума   Ответить с цитированием
Старый 27.11.2012, 05:10   #3 (permalink)
Léon
С# - learn or die
 
Аватар для Léon
 
Регистрация: 17.12.2011
Сообщений: 2,438
Записей в дневнике: 8
Сказал(а) спасибо: 21
Поблагодарили 49 раз(а) в 11 сообщениях
Репутация: 19701
По умолчанию

Нашла на просторах интернета похожую задачу:
Многочлен 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) совсем ничего непонятно.
Léon вне форума   Ответить с цитированием
Старый 27.11.2012, 17:36   #4 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Цитата:
Сообщение от Gruvi Посмотреть сообщение
тип памяти мне кажется уместно будет использовать byte, т.к. работаем с памятью
Бред, мы не знаем, какие именно значения коэффициентов надо хранить в динамическом массиве, поэтому ограничение отрезком [0;255] просто недопустимо.
Для коэффициентов определим тип массива целочисленный Integer, он допускает как положительные, так и отрицательные и нулевые значения.
Для хранения членов многочлена используем тип longint, он позволяет использовать достаточно большие значения при вычислениях.
Цитата:
Сообщение от 11Angelav Посмотреть сообщение
процедуру PRINT(P, S), которая выводит P как многочлен от переменной, равной коду символьной переменной S.
Думаю, речь идет о значении х, равном chr-коду символа, хранящегося в S. То есть нужно сначала запросить с клавиатуры ввод символа S, получить его chr-код и передать его функции в качестве значения переменной x. Затем вычислить значение многочлена с этим x.
AlexZir вне форума   Ответить с цитированием
Старый 28.11.2012, 18:17   #5 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Начало можно взять из найденного вами листинга, удалив из него лишние многочлены
Цитата:
Сообщение от 11Angelav Посмотреть сообщение
Многочлен 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), внеся в него незначительные изменения
AlexZir вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 04.12.2012, 08:17   #6 (permalink)
Léon
С# - learn or die
 
Аватар для Léon
 
Регистрация: 17.12.2011
Сообщений: 2,438
Записей в дневнике: 8
Сказал(а) спасибо: 21
Поблагодарили 49 раз(а) в 11 сообщениях
Репутация: 19701
По умолчанию

Я что-то тут намудрила, исправьте пожалуйста.
Код:
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.
Léon вне форума   Ответить с цитированием
Старый 04.12.2012, 09:35   #7 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Мда, действительно, намудрила
AlexZir вне форума   Ответить с цитированием
Старый 04.12.2012, 10:04   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от 11Angelav Посмотреть сообщение
Я что-то тут намудрила, исправьте пожалуйста.
Ох, Анжелика - достали-таки с этими "динамиками"!
Ну а вот что я "намудрил". Хотя честно предупреждал - в динамических размещениях я, по большому счету "не копенгаген" . А потому вот это требование: "При этом, если 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), ну или задавайте нулевые коэффициенты при больших степенях, а то рискуете вылететь за разрядную сетку.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.12.2012, 14:03   #9 (permalink)
Léon
С# - learn or die
 
Аватар для Léon
 
Регистрация: 17.12.2011
Сообщений: 2,438
Записей в дневнике: 8
Сказал(а) спасибо: 21
Поблагодарили 49 раз(а) в 11 сообщениях
Репутация: 19701
По умолчанию

Спасибо!!!
Léon вне форума   Ответить с цитированием
Старый 04.12.2012, 18:32   #10 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.