необходимо вывести для 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;
как выводиться информация ввиде таблице в данном случае ?? можно ли функцию в виде параметра передовать? что-то совсем всё забыл(
что-то я совсем всё забыл((( вот если такие процедуры написать они будут работать? не судите строго
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
20.02.2006 3:34
Только наоборот: при вводе массива добавить var в заголовок процедуры (иначе будешь получать все время нулевой массив, или мусор - зависит от компилятора), а при выводе - var необязателен...
punkska
20.02.2006 3:40
если в глобал.inc ввести Type mas = Array [1..5] of real; Var i:intefer;
а в программе Inc(A); то почему пишет что А- это неизвестый индефикатор (номер 3 ошибка) ??
volvo, огромное спасибо!
APAL
20.02.2006 3:50
Цитата(punkska @ 19.02.2006 23:40)
а в программе Inc(A); то почему пишет что А- это неизвестый индефикатор (номер 3 ошибка) ??
Может это от того, что A описан внутри процедуры, а не программы?
punkska
20.02.2006 12:50
даже если в варе описать, что A:mas ошибка остаёться =(
punkska
20.02.2006 13:04
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;
так работет, но вывод не происходит ....выдаёт 205 ошибку! подскажит, пжалуйста
klem4
20.02.2006 13:46
Ошибка в ф-и 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
20.02.2006 13:54
klem4 , спасибО! Помогло!
тока почему при разделение на файлы программе не нравиться
Цитата
а в программе Inc(A); то почему пишет что А- это неизвестый индефикатор (номер 3 ошибка) ??
volvo
20.02.2006 13:59
Заархивируй файлы именно так, как они у тебя разделены и не работают, и присоедини... Посмотрим...
klem4
20.02.2006 14:00
Кстати, советую поменять название своей ф-и ... inc - всетаки в паскале уже есть, и ты его используешь мнежду прочим помимо использования "своего" inc.
punkska
20.02.2006 14:05
название процедуры изменил( что-то не вышло(
volvo
20.02.2006 14:11
klem4, ну и что? Он же использует встроенный Inc ДО описания своего... Видимость процедур функций никто не отменял... Рукописный Inc в это время просто не виден, никаких проблем возникать не должно (если не менять процедуры местами)
punkska Так ты же ничего не подключаешь! {SI ...} поменяй на {$I ...}
punkska
20.02.2006 14:14
спасибо!!! надо было так облажаться)))
klem4
20.02.2006 21:28
А я и не говорил что ошибка из-за этого, просто это имхо не красиво так делать ... ;)
punkska
21.02.2006 1:21
для порядка и ясности напишу задание
Составить алгоритм модулю для вычисления y(x)=x/2+2*x^2/3+3*x^3/4+... вычислить пока очередной член ряда а н-ое > E вычислить для 5 значений x
ПРЕАОДОВАТЕЛЬ был взбешон и не доволен
1. этой строчкой в функции until ((next) < eps) or (n=100)
может быть можно регулировать сходимость ряда, изменяя количество нулей .... как вам такая мысль? что предложите
2. табличный вывод Я совсем забыл как он делаеться ! НО почитав хелп нашёл полезную инфу
по ней составил простую программу
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));чуть крыша не поехала!!! таблица не получалась)
потом вспомнил что таблицу можно рисовать через врайтлн а сами знаки -ЗАЖАВ АЛЬТ + НОМЕР СИМВОЛА!
но таблица не получаеться ровной! как сделать чтоб y(x) занимал заданное количество клеток y(x):6 не получаеться( что тут посоветуете?
3. необходимо написать эту же функцию тока с пред условие! что это значит? он про чикл мне говорил???
2. пункт
возможно написать универсальный модуль для построение таблиц??? может его на форуме уже писали!? Преподователь сказал что это ОЧЕНЬ сложно и он будет ОЧЕНЬ большим!!
volvo
21.02.2006 2:20
Цитата
для порядка и ясности напишу задание
А вот это надо было делать еще в САМОМ ПЕРВОМ сообщении... Ты этого не сделал, получил от преподавателя "на орехи"... В следующий раз будешь писАть задание сразу.
Сходимость ряда ТЫ регулировать не можешь, ряд у тебя задан раз и навсегда... Делай вот так, например (ввод данных организуешь сам...):
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
21.02.2006 2:33
Цитата
' ряд расходится !!!'
а не кажеться что это не верно? ведь нужно найти сумму !! а не выяснить сходимость ряда. Или я не прав? чему-то y всегда будет равен ..плю любом x
volvo
21.02.2006 2:36
Да, но не забывай, что тебе нужно находить сумму, ПОКА
Цитата
очередной член ряда а н-ое > E
... Будет ряд расходящимся - условие не выполнится никогда... Я предпочитаю дать сообщение и закончить программу корректно, а не получать Run-Time Errors... Но, впрочем, делай как знаешь...
punkska
21.02.2006 3:00
Цитата
1. этой строчкой в функции until ((next) < eps) or (n=100)
может быть можно регулировать сходимость ряда, изменяя количество нулей .... как вам такая мысль? что предложите
я хотел сказать что может стоит изменить E:=0.001 вот... тем самым мы уменьшаем кольчество повторений... хотя может ты про это и подумал....
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
Действительно если епс перенести работает))) тока таблица!!! кривая! помогите настроить чтоб красиво было
У тебя же числа ВЕЩЕСТВЕННЫЕ, а не целые! У них формат вывода другой.
punkska
27.02.2006 16:05
ВОТ прикрепил программу! вроде и таблицу рисует! есть ошибки! с чем связана такая большая разница между функциями y and y2 ? как улучшить табличный вывод? последняя ячейка получаеться пустой...как бы её удолить..
No matter
27.02.2006 16:37
punkska, внимательно глянь на программу, которую ты привел в предыдущем посте... У тебя в циклах While и Repeat одинаковые условия, а ведь по идее цикл While выполняется пока условие истинно, а Repeat - пока оно ложно.
То есть, у тебя 2 совершенно разных вычисления производятся.
punkska
27.02.2006 16:42
Спасибо! теперь обе колонки одинаковы! Спасибо всем!! всё сделал!!!!
punkska
28.02.2006 0:27
НЕТ НЕ ВСЁ! =(((( в программе много поменял...проверьте Не могу понять как передать функцию ввиде параметра..ФАК читал...вроде всё так сделал Laba.pas
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
28.02.2006 0:43
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
28.02.2006 0:58
агаааа...
ну ещё в процедуру вывода надо вписать res:mas; res2:mas;
всё* исправил но в таблице одни нули....что-то я не то сделал код приклепляю
volvo
28.02.2006 1:04
procedure root(n:integer; A:mas; Y:ftype; VAR Res:mas);
Без Var не пойдет
punkska
28.02.2006 1:07
Цитата
Без Var не пойдет
огромное спасибо!!!! Тебе надо памятник при жизни ставить...в виде кошки штоль...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.