Помощь - Поиск - Пользователи - Календарь
Полная версия: Курсовая для первого курса
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Floyd
Приветсвую всех. Прошу помоч сделать мне курсовую.
Тут отксерино все мое задание

http://img185.echo.cx/img185/2035/11by.th.gif

Я тут новенький и очень надеюсь на вашу помощ, еще неделя и нужно сдавать, если не сдам выгонят. Буду жутко признателен тому кто поможет. А отплатить... единственное что могу, так это сделать аватар любой сложности...
З.Ы.Хотя сомневаюсь что это кому то нужно сдесь...

Я присоединил изображение...
volvo
А поконкретнее? У тебя в задании неизвестно чего понаписано, причем все время есть ссылка на отсутствующие части. Что, трудно правильно поставить задание и не "отксерить" а записать его сюда?

С такой постановкой я думаю что тебе невозможно помочь...

Кстати, насчет вычисления интегралов: FAQ: Численное интегрирование
Floyd
Эх... Вот такие у нас курсовые.. Как можно еще легче написать, если это и есть ксерокс задания...
sad.gif
Может вы мне обьясните при чем сдесь это-
Цитата
Вычислить значения функции  ( табл.1) и построить график этой функции
для множества дискретных значений  , определяемых условиями           

График я смогу построить, а вот что значит "для множества дискретных значений"?
volvo
Да поймите Вы, я не могу ничего сказать, я же НЕ ВИЖУ табл.1, и кто его знает что там вообще написано???
Floyd
Простите...
:p2: Только что мне прислали не отксериное задание, а в файле.

Вот я сюда прекрипил, полностью с таблицами.. со всем.
Для начала бы разобратся в первом задании.
volvo
Цитата(Floyd @ 8.05.05 12:45)
что значит "для множества дискретных значений"?

Это значит в заданных точках, а не на всей области определения функции. То есть, насколько я вижу из задания, нужно будет найти значение функции в 8-ми точках...
Floyd
Тоесть, Хі у меня будет 8-м, и для них строить график.. Ок, я буду разбиратся сейчас.
Но буду очень благодарен если и вы поможите решить мне эту курсовую..
klem4
вот, чтобы ты совсем не грустил, первое задание :
{$n+}
uses crt;
function f(x:extended):extended;
begin
f:=x*x; {funkciya}
end;
var x,h,xStart,xStop,xmin,xmax:extended;
n:integer;

Begin
clrscr;
readln(n);
readln(xStart);
readln(xStop);
h:=(xStop-xStart)/(n-1);
x:=xStart;
xmax:=x;
xmin:=x;
while x<=xStop+h/2 do
begin
if f(x)>f(xmax) then
xmax:=x;
if f(x)<f(xmin) then
xmin:=x;
x:=x+h;
end;
writeln('xmax=',xmax:2:3,' f(xmax)=',f(xmax):2 :3);
writeln('xmin=',xmin:2:3,' f(xmin=)',f(xmin):2 :3);
readln
end.



на интегралы Volvo ссылку дал, а остальное действительно мутновато ..
Floyd
klem4
Сижу вот уже часов 6-ть и ни гу-гу=) Огромное спасибо!!! Интегралы сделаю сам, надеюсь... И буду уже тогда ко второму заданию переходить.
volvo
Цитата(Floyd @ 8.05.05 15:21)
Интегралы сделаю сам, надеюсь...

Обязательно свой велосипед изобрести? Я же дал ссылку на FAQ ... А там, между прочим, есть программа...
Floyd
Не, я не правильно выразился. сори. Естественно я воспользуюсь вашим FAQ.
Тока маленький вопрос, у меня функци вот такая

arcsin|корень|(х)
--------------------
корень(х*(1-х))


я правильно записал в Паскале?
(exp((-1)*ln(sin(sqrt(x)))))/sqrt(x*(1-x))
З.Ы.Ведь arcsin это sin в степени -1?
volvo
Цитата(Floyd @ 8.05.05 15:29)
я правильно записал в Паскале?
(exp((-1)*ln(sin(sqrt(x)))))/sqrt(x*(1-x))
З.Ы.Ведь arcsin это sin в степени -1?

:no: Это не калькулятор...
К сожалению в Паскале отсутствует встроенная функция вычисления арксинуса... Из всех Арков есть только арктангенс, пожтому приходится выражать ArcSin через ArcTan:
Function ArcSin(x: Real): Real;
begin
If Abs(x) = 1 Then ArcSin := 0
Else ArcSin := ArcTan(x / (1 - Sqr(x)))
end;

{ И потом вычисляешь: }
y := ArcSin(sqrt(x)) / sqrt(x * (1 - x));


smile.gif
Floyd
volvo
Хе хе! Так вот в чем заминка, спасибки... пойду продолжу работу...
Floyd
Люди помогите решить последние задание... а-то у меня проблемка вышла.
____
Взять интеграл от фунции вот такой
http://img185.echo.cx/img185/7906/14lg.gif
от a до b. Где a=0.2 и b=0.3.
Для вычислений использовать формулу трапеций и еще и формулу Симпсона.
И что б ответы совпали...
____
Разве ArcSin := ArcTan(x / (1 - Sqr(x))) .. там еще двока перед иксом должна быть, ведь так?
ArcSin := ArcTan(2*x / (1 - Sqr(x)))

____
В общем вот мое решение через процедуру (так в задании написано) которое выдает ошибку плавающей точки..
 
procedure intg(var int1,int2:real);
var h,suma,suma2,suma3,m:real; c:array[1..8] of real; y:array [1..8] of real;
i,g,k,q:integer;
  begin
     clrscr;
c[1]:=0.2;    q:=8; h:=0.0125;
for i:=2 to 8 do begin
c[i]:=c[i-1]+h;
 for g:=2 to (q-1) do begin
 c[i]:=c[g];
 suma:=c[g]+suma; end;
 int1:=(h/2)*(2*suma+y[1]+y[q]); {за формулой Трапеции}
 
for k:=2 to q-1 do begin
     c[g]:=c[k];
     m:= k mod 2;
     if m=0 then
     suma2:=suma2+f(c[k])
     else
     suma3:=suma3+f(c[k]); end;         end;
int2:=(h/3)*(c[1]+4*suma2+2*suma3+c[q]); {а это уже за Симпсоном}
writeln(int1);
writeln(int2);  readln  end;


З.Ы. f - это фунция кторую выше написал volvo
volvo
Цитата(Floyd @ 13.05.05 20:45)
Разве ArcSin := ArcTan(x / (1 - Sqr(x))) .. там еще двока перед иксом должна быть, ведь так?
ArcSin := ArcTan(2*x / (1 - Sqr(x)))

Ничего подобного. Повторяю еще раз:
Цитата
ArcSin(x) = ArcTan(x / Sqrt(1 - Sqr(x)))

Откуда ты взял двойку?

Кстати, где именно выдается ошибка в процедуре ?
Floyd
Место ошибки не указывается, если посмотреть что выводит программа, то она выводит следующее.
Runtime Error 207 at 04E3:0007
Ошибка именно в этой процедуре, так как я проверял Step`ом
volvo
Ты знаешь, я внимательно просмотрел процедуру: по-моему, у тебя неправильно расставлены Begin ... End. Я бы поставил так:

procedure intg(var int1,int2:real);
var
h,suma,suma2,suma3,m:real;
c:array[1..8] of real; y:array [1..8] of real;
i,g,k,q:integer;
begin
clrscr;
suma := 0; suma2 := 0; suma3 := 0; { <--- это никогда не помешает }
c[1]:=0.2; q:=8; h:=0.0125;
for i:=2 to 8 do { begin } { <--- убрать begin }
c[i]:=c[i-1]+h;
for g:=2 to (q-1) do begin
c[i]:=c[g];
suma:=c[g]+suma;
end;
int1:=(h/2)*(2*suma+y[1]+y[q]); {за формулой Трапеции}

for k:=2 to q-1 do begin
c[g]:=c[k];
m:= k mod 2;
if m=0 then suma2:=suma2+f(c[k])
else suma3:=suma3+f(c[k]);
end;

{ end; } { <--- убрать end }

int2:=(h/3)*(c[1]+4*suma2+2*suma3+c[q]); {а это уже за Симпсоном}
writeln(int1);
writeln(int2);
readln
end;


Попробуй это прогнать smile.gif
Floyd
volvo
Огромнейшее спасибо! Благодарю, супер! Работает.
Вот что вышло. Погрешность очень маленькая вроде, да? Тоесть все правильно! Уря!
I= 1.96677122947051E-0002
II= 1.62024424900892E-0001
klem4
ты знаешь, я вот тебе советую форматировать вывод вещественных чисел, дабы избежать ответа в экспоненциальной форме, например
writeln(int1:7:5);


те 7 знаков под число, и 5 после запятой. ;)
Floyd
Эт я просто показал для наглядности =) Но все равно спасибо.
Floyd
Что бы не создавать оттельную тему прошу помоч еще с одной прогой для друга.
Задание
Составить прогу котороя будет печатать имена студентов и предмет с которого получено "2".
_____
Прогу я наисал, но почему то она не пашит =)
В обшем, помогите довести прогу до рабочего состояния.
Перваую ошибку смотрите в коментариях.
program tp14;
uses crt;
type danni=record
predmet:array [1..5] of string; {предметов берем 5}
Mark:array [1..5] of integer; end;
studrec=record
name:string; end;
sub=danni;
var student:array [1..8] of studrec;
am:array [1..8] of string;
k,s,i,n,f,r:integer; min:string;
f2,f1:text;
Begin
assign (f2, 'dano.pas');reset(f2); assign(f1,'rez.pas'); rewrite(f1);
n:=0;
for i:=1 to 2 do begin s:=0; {возьмем к примеру два студента}
with student[i] do begin
readln(f, name);
for k:=1 to 5 do begin
with sub do begin {А вот тут выдает что просит поставить "(" но зачем???)}
readln(f2,predmet[k]); end;
if student[i].danni.mark[k]=2 then
s:=s+1; end;
if s=5 then begin n:=n+1;
am1[n]:=student[i].name;
writeln(f1, am1[n]); end; end; end.

_____
З.Ы.Кстати курсовую я сдал, и все благодаря Вам!
volvo
Цитата(Floyd @ 16.05.05 20:44)
А вот тут выдает что просит поставить "(" но зачем???)

Все правильно выдает... У тебя же Sub это не переменная какого-то типа, а само описание типа. И ты не имеешь права его использовать в программе (за одним исключением, только для того, чтобы привести какую - либо переменную к типу Sub). Вот как раз для приведения нужно, чтобы следом за идентификатором типа в скобках шло имя переменной... Поэтому у тебя и просят скобку.

Выход один - объяви переменную типа Sub, и работай с ней...
Floyd
Такс, смотри я подправил.. тока не доганяю, например читаю я такую инфу

Grisha
pr1
4
pr2
3
pr3
3
pr4
2
pr5
5
down
pr1
2
pr2
2
pr3
2
pr4
2
pr5
2


А прога выдет только одно "down" и все...
А вот прога сама
program tp14;
              {Vykonav Kravets Artem}
uses crt;
type danni=record
 predmet:array [1..5] of string;
 Mark:array [1..5] of integer; end;
 studrec=record
  name:string;
  sub:danni; end;
  var student:array [1..8] of studrec;
      sub:array [1..5] of danni;
am1:array [1..8] of string;   am:array [1..8] of string;
k,s,i,n,f,r:integer; min:string;
f2,f1:text;
  Begin
  assign (f2, 'dano.pas');reset(f2);   assign(f1,'rez.pas');  rewrite(f1);
    n:=0;
   for i:=1 to 2 do begin s:=0;
   with student[i] do begin
    readln(f2, name);
     for k:=1 to 5 do begin
      with sub  do begin
       readln(f2,predmet[k]);
       readln(f2,mark[k]); end;
if student[i].sub.mark[k]=2 then
s:=s+1; end;
if s=5 then begin n:=n+1;
 am1[n]:=student[i].name;
    writeln(f1, am1[n]); end; end; end;close(f1); end.

volvo
Ну, все правильно выдает... Ты же это и просил:
if s=5 then begin
n:=n+1;
am1[n]:=student[i].name;
writeln(f1, am1[n]);
end;

а когда n = 5? Когда 5 двоек !!! У "Гриши"-то не только 2-ки есть smile.gif
Floyd
А понял, я завтыкал =) А как мне дописать что бы еще предмет выводило по которой двойка?
Floyd
Люди, помогите пожалуйста, как для выше преведеной проги дописать что бы еще показывало с какого предмета двойка...
volvo
Ну, можно просто вместо
if student[i].sub.mark[k]=2 then s:=s+1;

написАть:
if student[i].sub.mark[k]=2 then begin
s:=s+1;
am[s] := student[i].sub.predmet[k];
end;

и потом не
if s=5 then begin
n:=n+1;
am1[n]:=student[i].name;
writeln(f1, am1[n]);
end;

а вот так:

if s > 0 then begin
writeln(f1, student[i].name);
for j := 1 to s do writeln(f1, am[j]);
end;

это будет просто распечатывать для каждого студента, у которого есть 2-ки, по какому предмету они получены...
Floyd
Спасибо, я исправил текст вот так

uses crt;
type danni=record
 predmet:array [1..5] of string;
 Mark:array [1..5] of integer; end;
 studrec=record
  name:string;
  sub:danni; end;
  var student:array [1..8] of studrec;
      sub:array [1..5] of danni;
am1:array [1..8] of string;   am:array [1..8] of string;
k,s,i,n,f,r,j:integer; min:string;
f2,f1:text;
  Begin
  assign (f2, 'dano.pas'); reset(f2);   assign(f1,'rez.pas');  rewrite(f1);
    n:=0;
   for i:=1 to 2 do begin s:=0;
   with student[i] do begin
    readln(f2, name);
     for k:=1 to 5 do begin
      with sub  do begin
       readln(f2,predmet[k]);
       readln(f2,mark[k]); end;
if student[i].sub.mark[k]=2 then begin
 s:=s+1;
 am1[s] := student[i].sub.predmet[k];
if s > 0 then begin
 writeln(f1, student[i].name); end;
 for j := 1 to s do writeln(f1, am1[j]);
 end; end; end; end;  close(f1);  end.


А выводит мне вот такое
Grisha
pr4
down
pr1
down
pr1
pr2
down
pr1
pr2
pr3
down
pr1
pr2
pr3
pr4
down
pr1
pr2
pr3
pr4
pr5


Где то неправильно закрыт цыкл... но вот где?
volvo
Ну так отформатируй текст как положено - увидишь. С таким расположением как у тебя найти неправильное закрытие просто нереально...

P.S. Это как раз здесь:
if student[i].sub.mark[k]=2 then begin
s:=s+1;
am1[s] := student[i].sub.predmet[k];
{ тут должен быть END }

читай мои сообщения внимательно !
Floyd
Спасибо! lol.gif
Floyd
В общем, как я говорл, благодаря Вам я сдал курсач =).
А вот мой друг не сдал, почему то не пашит процедура решения интеграла, выдает ошибку Invalid floating operation 207
А в окне пишит
Runtime error 207 at 000F:0003
____
помогите разобратся в чем проблемка....
Интеграл там рещается двумя способами, способом парралелограмма и Симпсона.
program kursova_robota_PM_41_7_variant;
{Vykonav Schutskiy Pavlo}
uses graph,crt;
type vekt=array[1..1000] of real;
var n:integer; h,itg,g,t,int1,int2,s1,sh,intg,intgs:real; NN,NK,i:integer; w:text; ci,mi:vekt;
const a=0.2; b=0.3;
{_______________________________________}
     function ArcSin(x:real):real;
begin
if Abs(x) = 1 then ArcSin:=0 else
ArcSin:=ArcTan(x/(1-sqr(x))); end;
{---------------------------------------------------------------------------}

function f(x:real):real;
begin
  f:=ArcSin(sqrt(x))/sqrt(x*(1-x));
end;
{--------------------------------------------------------------------------}

procedure Grafika;
var gd, gm: integer;
   x,y: real;
begin
  gd:=detect;
  initgraph(gd, gm, '');
  SetBkColor(white);
  SetColor(4);
  Line(0, 100, 640, 100);
  Line(320, 0, 320, 480);
  SetColor(green);
  outtextxy(50,10,'Kursova Robota');  outtextxy(420,10,'Grafik Funkcii');
  outtextxy(50,20,'Vikonav Schutskiy Pavlo');
  outtextxy(50,30,'PM-41');
  PutPixel(320,240,0);
  outtextxy(325,245,'0');
     x:=0.2;
     While x<=0.9    do
begin
       y:=ArcSin(sqrt(x))/sqrt(x*(1-x));
       PutPixel(round(x*155)+350,round(y*155), 4);
       x:=x+0.00125;
end; repeat until keypressed; cleardevice;  closegraph;end;
{--------------------------------------------------------------------------}
procedure Zn(x,h:real);
var  c:array[1..8] of real;
i:integer; y:real;
begin
assign(w,'dan.pas'); rewrite(w);
writeln(w,'Znachennya funcii dlya kojnogo z X');
x:=0.2;  h:=0.0125;
for i:=1 to 8 do begin x:=x+h;
y:=ArcSin(sqrt(x))/sqrt(x*(1-x));
c[i]:=y;
write(w,'f[',i,']=',c[i]:2 :3,'  ');
end;end;
{--------------------------------------------------------------------------}
procedure MaxMin(n:integer;h:real);
var x,xStart,xStop,xmin,xmax:extended;
begin
writeln(w,'');
writeln(w,'Znahodjennya MAX i MIN funcii:');
     xStart:=0.2;
     xStop:=0.3;
     x:=xStart;
     xmax:=x;   xmin:=x;
     while x<=xStop+h/2 do
begin
     if f(x)>f(xmax) then   xmax:=x;
     if f(x)<f(xmin) then  xmin:=x;
     x:=x+h;
end;
writeln(w,'Maksumalne znachennya funcii=',f(xmax):2 :3);
writeln(w,'Minimalne  znachennya funcii=',f(xmin):2 :3); writeln('');
end;
  {----------------------------------------------------------------------}
procedure Sum(x,h:real);
var Sum,y:real; i:integer; c:array [1..8] of real;
begin
for i:= 1 to 8  do begin
      if i>=6 then begin
   sum:=sum+x; end;
   x:=x+h;
end;
writeln(w,'Summa=',sum:3:3);writeln('');
end;
  {------------------------------------------------------------------------}
{nahogdenie integrala}
 procedure integral(x,y:vekt;var int,ints:real);
   var summa1,summa2,summa3,h:real;w,k,n,b:integer;
 begin
   summa1:=0; summa2:=0; summa3:=0; n:=8; h:=0.0125;
   w:=0;k:=0;n:=0;b:=0;
  for k:=2 to n do
   summa1:=summa1+2*y[k];
   int:=(h/2)*(y[1]+summa1+y[n+1]);
 for w:=2 to n-1 do         begin
   b:=w mod 2;
 if b=0 then
   summa2:=summa2+4*y[w] else
   summa3:=summa3+2*y[w]; end;
   ints:=(h/3)*(y[1]+summa2+summa3+4*y[n]+y[n+1]);
end;

{--------------------------------------------------------------------------}
Begin
   clrscr;
        Grafika;
assign(w,'dan.pas');rewrite(w);
     n:=8; h:=0.0125;
     s1:=0.2;
     Zn(s1,h);
     MaxMin(n,h);
     Sum(s1,h);
ci[1]:=0; n:=8; h:=0.0125;
 for i:=2 to (n+1) do begin
   ci[i]:=ci[i-1]+h;
 for i:=1 to (n+1) do
   mi[i]:=f(ci[i]);
     integral(ci,mi,intg,intgs);  end;
writeln(w,'Pershiy integral= ',intg:3 :3);
writeln(w,'Drugiy integral=  ',intgs:3 :3); reset(w);  end.

volvo
И не будет работать:
function f(x:real):real;
begin
f:=ArcSin(sqrt(x))/sqrt(x*(1-x));
end;
...
ci[1]:=0;
for i:=1 to (n+1) do mi[i]:=f(ci[i]); { Деление на 0 как минимум тебе обеспечено... }

Floyd
Эх... точно, исправил на 0.2 а n исправил на 7... все равно не пашет...
volvo
2 вещи мешают проекту нормально оаботать:

1 - то, что у тебя ОПЯТЬ неверно расставлены скобки begin ... end. На этот раз - здесь:
for i:=2 to (n+1) do { begin } { <-- Убрать begin }
ci[i]:=ci[i-1]+h;
for i:=1 to (n+1) do
mi[i]:=f(ci[i]);
integral(ci,mi,intg,intgs); { end; } { <-- Убрать end }


2 - файл открывается дважды и из-за этого вывод в файл работает некорректно:
procedure Zn(x,h:real);
var c:array[1..8] of real;
i:integer; y:real;
begin
assign(w,'dan.pas'); rewrite(w); { <--- Убери эту строку }
...


Вот так smile.gif
Floyd
Ты гений, что я еще могу сказать. Благодарю, очень сильно =) И извиняюсь если надоедаю постоянно=)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.