Помощь - Поиск - Пользователи - Календарь
Полная версия: Табличный вывод!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
punkska
необходимо вывести для 5 или больше значений X значение сходимости ряда
Program Lab0;
Uses crt;
{$F+}
{SI global.inc}
{SI func.inc}
{SI inout.inc}
Begin
CLRSCR;
Writeln('Laba1');
Writeln('+--------------+');
Writeln('+--------------+');
Writeln('THE END.');
readln;
END.

func.inc
function Y(x: double): double;
const eps = 0.0000001;
var
s, next: double;
n: integer;
begin
next := 1;
s := next; n := 1;
repeat
inc(n);
next := next*(n-1)*x/n;
s := s + next;
until (next) < eps;
Y:= s
end;


как выводиться информация ввиде таблице в данном случае ?? можно ли функцию в виде параметра передовать? что-то совсем всё забыл(
volvo
Можно... Читай здесь:
FAQ: Процедурные типы
punkska
что-то я совсем всё забыл((( norespect.gif вот если такие процедуры написать они будут работать? не судите строго wacko.gif

inout.inc
  procedure inс(A:mas);
Var
i:integer;
begin
for i:=1 to 5 do
Writeln('Vvedite',i,' -bIU* X');
readln(A[i]);
end;

procedure out(var A:mas);
Var
i:integer;
begin
Writeln('X Cymma P9IDA')'
for i:=1 to 5 do
Writeln('X=',A[i],' ',y(A[i]));
readln;
end;
volvo
Только наоборот: при вводе массива добавить var в заголовок процедуры (иначе будешь получать все время нулевой массив, или мусор - зависит от компилятора), а при выводе - var необязателен...
punkska
если в глобал.inc
ввести
Type mas = Array [1..5] of real;
Var
i:intefer;

а в программе Inc(A); то почему пишет что А- это неизвестый индефикатор (номер 3 ошибка) ??

volvo, give_rose.gif огромное спасибо!
APAL
Цитата(punkska @ 19.02.2006 23:40) *


а в программе Inc(A); то почему пишет что А- это неизвестый индефикатор (номер 3 ошибка) ??



Может это от того, что A описан внутри процедуры, а не программы?
punkska
даже если в варе описать, что A:mas ошибка остаёться =(
punkska
 Program Lab1;
Uses crt;
Type mas = Array [1..5] of real;
Var
i:integer;
A: mas;
function Y(x: double): double;
const eps = 0.0000001;
var
s, next: double;
n: integer;
begin
next := 1;
s := next; n := 1;
repeat
inc(n);
next := next*(n-1)*x/n;
s := s + next;
until (next) < eps;
Y:= s
end;
procedure inc(var A:mas);
Var
i:integer;
begin
for i:=1 to 5 do Begin
Writeln('Vvedite',i,' -bIU* X');
readln(A[i]);
end;
end;

procedure out(A:mas);
Var
i:integer;
begin
Writeln('X Cymma P9IDA');
for i:=1 to 5 do
Writeln('X=',A[i],' ',y(A[i]));
readln;
end;

Begin
CLRSCR;
Writeln('Laba1');
Writeln('+--------------+');
Inc(A);
Out(A);
Writeln('+--------------+');
Writeln('THE END.');
readln;
END.


так работет, но вывод не происходит ....выдаёт 205 ошибку! подскажит, пжалуйста
klem4
Ошибка в ф-и y(x:double), практически никогда не выполняется исловие next < eps

Если ошибки в вычислениях нет, то можно сделать так :

function Y(x: double): double;
const eps = 0.001;
var
s, next: double;
n: integer;
begin
next := 1;
s := next; n := 1;
repeat
inc(n);
next := next*(n-1)*x/n;
s := s + next;
until ((next) < eps) or (n=100); {<--------}
Y:= s
end;
punkska
klem4 , спасибО! Помогло!

тока почему при разделение на файлы программе не нравиться
Цитата
а в программе Inc(A); то почему пишет что А- это неизвестый индефикатор (номер 3 ошибка) ??
volvo
Заархивируй файлы именно так, как они у тебя разделены и не работают, и присоедини... Посмотрим...
klem4
Кстати, советую поменять название своей ф-и ... inc - всетаки в паскале уже есть, и ты его используешь мнежду прочим помимо использования "своего" inc.
punkska
название процедуры изменил( что-то не вышло(
volvo
klem4, ну и что? Он же использует встроенный Inc ДО описания своего... Видимость процедур функций никто не отменял... Рукописный Inc в это время просто не виден, никаких проблем возникать не должно (если не менять процедуры местами)

punkska
Так ты же ничего не подключаешь!
{SI ...}
поменяй на
{$I ...}
punkska
give_rose.gif спасибо!!!
надо было так облажаться))) lol.gif
klem4
А я и не говорил что ошибка из-за этого, просто это имхо не красиво так делать ... ;)
punkska
для порядка и ясности напишу задание

Составить алгоритм модулю для вычисления y(x)=x/2+2*x^2/3+3*x^3/4+...
вычислить пока очередной член ряда а н-ое > E
вычислить для 5 значений x


ПРЕАОДОВАТЕЛЬ был взбешон и не доволен

1. этой строчкой в функции until ((next) < eps) or (n=100)

может быть можно регулировать сходимость ряда, изменяя количество нулей .... как вам такая мысль?
что предложите

2. табличный вывод norespect.gif Я совсем забыл как он делаеться ! НО почитав хелп нашёл полезную инфу

по ней составил простую программу

program znaki;
uses crt;
var
i: integer;
Begin
for i:=179 to 219 do write(i,' ',chr(i),' ');
readkey;
end.


в начале начал писать таблицу циклами что0то типо for i:=1 to 15 do writeln(chr(205)); wr//(chr(187));чуть крыша не поехала!!! wacko.gif таблица не получалась)

потом вспомнил что таблицу можно рисовать через врайтлн а сами знаки -ЗАЖАВ АЛЬТ + НОМЕР СИМВОЛА!

но таблица не получаеться ровной! как сделать чтоб y(x) занимал заданное количество клеток y(x):6 не получаеться(
что тут посоветуете?

3. необходимо написать эту же функцию тока с пред условие! что это значит? он про чикл мне говорил???


2. пункт

возможно написать универсальный модуль для построение таблиц??? может его на форуме уже писали!?
Преподователь сказал что это ОЧЕНЬ сложно и он будет ОЧЕНЬ большим!!
volvo
Цитата
для порядка и ясности напишу задание
А вот это надо было делать еще в САМОМ ПЕРВОМ сообщении... Ты этого не сделал, получил от преподавателя "на орехи"... В следующий раз будешь писАть задание сразу.

Сходимость ряда ТЫ регулировать не можешь, ряд у тебя задан раз и навсегда... Делай вот так, например (ввод данных организуешь сам...):
const
eps = 0.0001;
n = 5;
x: array[1 .. n] of double =
(0.1, 0.5, 0.75, 1.25, 3.75);

var
s, next: double;
i, j: integer;

begin
for i := 1 to n do
if x[i] < 1 then begin

s := 0;
next := 1; j := 1;
repeat

inc(j);
next := next * x[i];
s := s + j * next / succ(j);

until (j * next / succ(j)) < eps;
writeln('x = ', x[i]:10:5, ' s = ', s:10:5)

end
else writeln('x = ', x[i]:10:5, ' ряд расходится !!!');

end.
punkska
Цитата
' ряд расходится !!!'

а не кажеться что это не верно?
ведь нужно найти сумму !! а не выяснить сходимость ряда. Или я не прав?
чему-то y всегда будет равен ..плю любом x
volvo
Да, но не забывай, что тебе нужно находить сумму, ПОКА
Цитата
очередной член ряда а н-ое > E
... Будет ряд расходящимся - условие не выполнится никогда... Я предпочитаю дать сообщение и закончить программу корректно, а не получать Run-Time Errors... Но, впрочем, делай как знаешь...
punkska
Цитата
1. этой строчкой в функции until ((next) < eps) or (n=100)

может быть можно регулировать сходимость ряда, изменяя количество нулей .... как вам такая мысль?
что предложите


я хотел сказать что может стоит изменить E:=0.001 вот... тем самым мы уменьшаем кольчество повторений...
хотя может ты про это и подумал....
punkska
Lab1.pas
Program Lab1;
Uses crt;
{$F+}
{$I global.inc}
{$I func.inc}
{$I inout.inc}
Begin
CLRSCR;
Writeln('Laba1');
Writeln('+--------------+');
Inc(A);
Out(A);
Writeln('+--------------+');
Writeln('THE END.');
readln;
END.


func.inc
function Y(x: real): real;
const eps = 0.0001;
var
s, next: real;
n: integer;
begin
next := 1;
s := next; n := 1;
repeat
inc(n);
next := next*(n-1)*x/n;
s := s + next;
until (next) < eps;
Y:= s
end;

function Y2(x: real): real;
const eps = 0.0000001;
var
s, next: real;
n: integer;
begin
next := 1;
s := next; n := 1;
While (next) < eps do
Begin
inc(n);
next := next*(n-1)*x/n;
s := s + next;
end;
Y2:= s
end;


global.inc
Type mas = Array [1..5] of real;
Var
i: integer;
A: mas;


inout.inc

procedure Inc(var A:mas);
Var
i:integer;
begin
for i:=1 to 5 do
Begin
Writeln('Vvedite ',i,' -bIU* X');
readln(A[i]);
end;
end;

{ procedure out(A:mas);
Var
i:integer;
begin
Writeln('X Cymma P9IDA');
for i:=1 to 5 do
Writeln('X=',A[i],' ',y(A[i]));
readln;
end;
}

Procedure out(A:mas);
var
i:integer;
Begin
Writeln('╒══════╤══════════╤══════════╕');

for i:=1 to 5 do
begin
Writeln('│', A[i]:4 ,'│', Y(A[i]):8 ,'│', Y2(A[i]):8 ,'│');
Writeln('╞══════╪══════════╪══════════╡');
end;
Writeln('╘══════╧══════════╧══════════╛');
end;


программа прерываеться после ввода данных и указывает на ошибку 205 в первой функции! помогите отладить программу!

ну наверно нужно из функций вычеркнуть EPS и записать строчку Const eps=0.00001; в глобал.inc

Действительно если епс перенести работает)))
тока таблица!!! кривая! помогите настроить чтоб красиво было unsure.gif
No matter
Ты вообще ответы читаешь?
Writeln('│', A[i]:4:2 ,'│', Y(A[i]):8:3 ,'│', Y2(A[i]):8:3 ,'│');


У тебя же числа ВЕЩЕСТВЕННЫЕ, а не целые! У них формат вывода другой.
punkska
ВОТ прикрепил программу! вроде и таблицу рисует!
есть ошибки!
с чем связана такая большая разница между функциями y and y2 ?
как улучшить табличный вывод?
последняя ячейка получаеться пустой...как бы её удолить..
No matter
punkska, внимательно глянь на программу, которую ты привел в предыдущем посте... У тебя в циклах While и Repeat одинаковые условия, а ведь по идее цикл While выполняется пока условие истинно, а Repeat - пока оно ложно.

То есть, у тебя 2 совершенно разных вычисления производятся.
punkska
give_rose.gif Спасибо! теперь обе колонки одинаковы!
Спасибо всем!! всё сделал!!!!
punkska
НЕТ НЕ ВСЁ! =((((
в программе много поменял...проверьте
Не могу понять как передать функцию ввиде параметра..ФАК читал...вроде всё так сделал
Laba.pas
Program Lab1;
Uses crt;
{$F+}
{$I global.inc}
{$I func.inc}
{$I inout.inc}
Begin
CLRSCR;
Writeln('Laba1');
Inc(n,A);
CLRSCR;
root(n,A,Y,Res);
root(n,A,Y2,Res2);
Out(n,A);
Writeln('THE END.');
readln;
END.


global.inc
Const eps=0.0001;  n=5;
Type mas = Array [1..n] of real;
ftype = function (Var x:real):real;
Var
Res,Res2,A: mas;
y,y2:ftype;


func.inc
function Y(x: real): real;
var
s, next: real;
n: integer;
begin
next := 1;
s := next; n := 1;
repeat
inc(n);
next := next*(n-1)*x/n;
s := s + next;
until (next) < eps;
Y:= s
end;

function Y2(x: real): real;
var
s, next: real;
n: integer;
begin
next := 1;
s := next; n := 1;
While (next) > eps do
Begin
inc(n);
next := next*(n-1)*x/n;
s := s + next;
end;
Y2:= s
end;


inout.inc
 procedure Inc(var A:mas; n:integer);
Var
i:integer;
begin
for i:=1 to n do
Begin
Writeln(' Vvedite X[',i,']');
readln(A[i]);
end;
end;



Procedure out(A:mas; n:integer);
var
i:integer;
Begin
Writeln('ЙННННННЛННННННННННННЛНННННННННННН»');
Writeln('є',' X ','є',' Y(x) ','є',' Y2(x) ','є');
Writeln('МННННННОННННННННННННОНННННННННННН№');
for i:=1 to (n-1) do
begin
Writeln('є', A[i]:6:2 ,'є', Res[i]:12:5 ,'є', Res2[i]:12:5 ,'є');
Writeln('МННННННОННННННННННННОНННННННННННН№');
end;
Writeln('є', A[n]:6:2 ,'є', Res[n]:12:5 ,'є', Res2[n]):12:5 ,'є');
Writeln('ИННННННКННННННННННННКННННННННННННј');
end;

procedure root(n:integer; A:mas; Y:ftype; Res:mas);
var
i:integer;
Begin
for i:=1 to n do
Res[i]:=Y(A[i]);
end;
end;


Проблема возникла с функцией root и передачи в неё функций Y and Y2
volvo
punkska,
Первое: ты не должен объявлять переменную функционального типа (то, что ты делаешь в GLOBAL.INC:
Var
Res,Res2,A: mas;
y, y2:ftype; { <-- Это не нужно... }
)

Второе: сама процедура Root - ты явно забыл там Begin
procedure root(n:integer; A:mas; Y:ftype; Res:mas);
var
i:integer;
Begin
for i:=1 to n do begin { <-- Здесь }
Res[ i ]:=Y(A[ i ]);
end;
end;

Третье: в основной программе ты должен поменять местами аргументы Inc и Out, потому что ты первым должен передавать массив, и только потом - N
Четвертое: Заголовки функции в описании типа и при реализации не должны различаться, а у тебя:

// ...
Type
mas = Array [1..n] of real;
ftype = function (Var x:real):real; { <-- Обрати внимание на Var !!! }

// ...

function Y(x: real): real; { <-- Где Var ? }
var ...


Вроде, все...
punkska
агаааа...

ну ещё в процедуру вывода надо вписать res:mas; res2:mas;

всё* исправил но в таблице одни нули....что-то я не то сделал
код приклепляю
volvo
procedure root(n:integer; A:mas; Y:ftype; VAR Res:mas);
Без Var не пойдет smile.gif
punkska
Цитата
Без Var не пойдет

yes2.gif good.gif give_rose.gif огромное спасибо!!!! Тебе надо памятник при жизни ставить...в виде кошки штоль...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.