Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2013, 22:34   #1
Natashasha
 
Регистрация: 29.10.2013
Сообщений: 4
По умолчанию Переделать программу по построению графика функции из Pascal в С++ Builder 6

Данная программа написана в Паскале,а сказали сделать ее в С++ Builder,а я в нем не слишком разбираюсь.Была бы очень благодарна за помощь.
Код:
uses crt, graph;
label 1;
const k=2.3;
e=0.001;
 var r,g,max,p:real;
    n:byte;
    ak,aik,t,tt:real;
    a:array[1..2,1..2] of real;
    b,q:array[1..2] of real;
    z:array[1..3]of real;
    i,j,d,d1,m,m1,l,y,gd,gm,yy:integer;
    stx,shag,rez,mp:array[1..4]of string;
    hagi:array[1..4] of integer;
    st,st2,st3,st1:string;
    a2,b2,c2:real;
    grDriver, grMode, ErrCode:integer;
    v:char;
    currI,currJ:integer;

function rt(x:real):real;
begin
rt:=0.4+Arctan(x)-x;
end;

function fun(x:real):real;
begin
fun:=1/(1+x*x)-1;
end;

function qwe(x:real):real;
begin
qwe:=0.4+arctan(x);
end;

function pr(x:real):real;
begin
pr:=1/(1+x*x);
end;


Procedure metodBissekcii(var res,hag,fx:string;var shag4:integer);
var
r:real;
begin
shag4:=0;
a2:=1;
b2:=2;
if rt(a2)*rt(b2)<0 then
begin
while abs(a2-b2)>=e do
begin
inc(shag4);
c2:=(a2+b2)/2;
if rt(a2)*rt(c2)<0 then
begin
b2:=c2;
end
else begin
a2:=c2;
end;end;
end;
str(c2:0:8,res);
str(shag4,hag);
str(rt(c2):0:8,fx);
end;


Procedure metodHord(var res1,hag,fx:string;var shag1:integer);
var
r1,a,b,x0:real;
begin
shag1:=0;
a:=1;
b:=2;
if rt(a)<0 then x0:=a
else x0:=b;
r1:=x0;
repeat
inc(shag1);
x0:=r1;
if rt(a)<0 then

r1:=x0-(rt(x0)*(b-x0))/(rt(b)-rt(x0))

else

r1:=x0-(rt(x0)*(x0-a))/(rt(x0)-rt(a));

until abs(r1-x0)<=e;
str(r1:0:8,res1);
str(shag1,hag);
str(rt(r1):0:8,fx);
end;


procedure metodProstoiIteracii(var res2,hag,fx:string;var shag2:integer);
var
r2,x2,a,b:real;
begin
a:=1;
b:=2;
shag2:=0;
if pr(x2)>0 then  begin
x2:=b end else begin
x2:=a;
end;
r2:=qwe(x2);
repeat inc(shag2);
x2:=r2; r2:=qwe(x2);
until abs(r2-x2)<=e;
str(r2:0:8,res2);
str(shag2,hag);
str(rt(r2):0:8,fx);
end;


procedure metodNutona(var r:real;var res2,hag,fx:string;var shag3:integer);
var
x:real;
begin
shag3:=0;
x:=1;
r:=x;
repeat
inc(shag3);
x:=r;
r:=x-rt(x)/fun(x);
until abs(r-x)<=e ;
str(r:0:8,res2);
str(shag3,hag);
str(rt(r):0:8,fx);
end;



function gor (t:real):real;
var y:real; i:byte;
begin
y:=z[1];
for i:=2 to 3 do
y:=y*t+z[i];
gor:=y;
end;



function menu(key:char; f:boolean):boolean;

begin
cleardevice;         setbkcolor(black);
  if f then begin currI:=1; currJ:=1; end;
  if v = #80 then inc(currI)
  else if v = #72 then dec(currI);
  if (v = #75) and (currI = 2) then dec(currJ)
  else if (v = #77) and (currI = 2) then inc(currJ);
  if currI > 4 then currI:=1; if currJ > 2 then currJ:=1;
  if currI < 1 then currI:=4; if currJ < 1 then currJ:=2;
  if (v in [#75, #72, #77, #80]) or (f) then begin

    setFillStyle(1,8);
    if currI = 1 then setFillStyle(1,3);
    bar(1,1,130,20);  outTextXY(3,9,'’ Ў«Ёж  §* зҐ*Ё©'); setFillStyle(1,8);
    if currI = 2 then begin
      if currJ = 1 then setFillStyle(1,3);
      bar(132,22, 270, 40); outTextXY(145,28,'ॠ«м*®Ґ ўаҐ¬п'); setFillStyle(1,8);
      if currJ = 2 then setFillStyle(1,3);
      bar(272,22, 390, 40); outTextXY(275,28,'¬ иЁ**®Ґ ўаҐ¬п'); setFillStyle(1,8);
      setFillStyle(1,3);        end;
      bar(1,22,130,40); outTextXY(30,28,'ѓа дЁЄЁ    }'); setFillStyle(1,8);
     if currI = 3 then setFillStyle(1,3);
    bar(1,42,130,60); outTextXY(30,48,'ђҐиҐ*ЁҐ Ќ“'); setFillStyle(1,8);
    if currI = 4 then setFillstyle(1,3);
    bar (1,62,130,80); outTextXY(30,68,'Exit'); setFillStyle(1,8);
                        end;
  if v = #13 then
  begin
    if currI = 1 then
    begin                 clrscr;

    
      cleardevice;             setcolor(10);
      menu:=true;
      bar(50,10,320,420);
 line(50,10,320,10);
t:=0;
for i:=1 to 20 do
line(50,40+18*i,320,40+18*i);
setlinestyle(0,2,2);
line(50,10,50,420);
line(180,10,180,420);
line(320,10,320,420);
line(50,420,320,420);
outtextxy(105,25,'t');
outtextxy(220,25,'F(t)');
for i:= 1 to 20 do begin
t:=t+1;
tt:=t;
str(tt:3:1,st);
tt:=abs(gor(t));
str(tt:3:3,st3);
outtextxy(105,(i+1)*18+27,st);
outtextxy(230,(i+1)*18+27,st3);
    end;  setcolor(white);
    end
    else if currI = 2 then
    begin
      if currJ = 1 then
      begin
      cleardevice;     {ॠ«м*®Ґ}

gd:=detect;
initgraph(gd,gm,' ');
cleardevice;
setBKColor(white);
setcolor(9);
outtextxy(120,370,'100');
outtextxy(120,330,'200');
outtextxy(120,285,'300');
outtextxy(120,246,'400');
outtextxy(120,205,'500');
outtextxy(120,164,'600');
outtextxy(120,123,'700');
outtextxy(120,82,'800');
outtextxy(120,41,'900');
outtextxy(150,430,'0    2    4    6    8    10    12    14   16   18  20');
setcolor(10);
for i:=1 to 10 do begin
moveto(150,420-i*41);
lineto(570,420-i*41);   end;
line(150,420,570,420);
Natashasha вне форума Ответить с цитированием
Старый 29.10.2013, 22:35   #2
Natashasha
 
Регистрация: 29.10.2013
Сообщений: 4
По умолчанию

и продолжение:
Код:
for i:=1 to 10 do begin
moveto(150+i*42,420);
lineto(150+i*42,10);
line(150,10,150,420);
    end;
setcolor(red);
yy:=trunc(4100/gor(20));
t:=0;
tt:=t;
st2:='ᥪг*¤®¬Ґа';
tt:=gor(t);
outtextxy(15,100,st);
settextstyle(0,0,1);
for i:=1 to 20 do begin
setbkcolor(black);
bar(10,92,110,140);
t:=t+1;
tt:=t;
str(tt:3:1,st);
tt:=gor(t);
str(tt:3:3,st3);
outtextxy(15,100,st2);
outtextxy(30,130,st);
setlinestyle(0,4,3);
line(150+(i-1)*21,420-trunc(round((gor(t-1)*yy)/10)),150+i*21,420-trunc(round((gor(t)*yy)/10)));
delay(500);
end;  setcolor(white);
      end
      else
      begin

      clrscr;

gd:=detect;
initgraph(gd,gm,' ');
cleardevice;
setBKColor(white);
setcolor(9);
outtextxy(120,370,'100');
outtextxy(120,330,'200');
outtextxy(120,285,'300');
outtextxy(120,246,'400');
outtextxy(120,205,'500');
outtextxy(120,164,'600');
outtextxy(120,123,'700');
outtextxy(120,82,'800');
outtextxy(120,41,'900');
outtextxy(150,430,'0    2    4    6    8    10    12   14    16   18   20');
setcolor(10);

for i:=1 to 10 do begin
moveto(150,420-i*41);
lineto(570,420-i*41);   end;
line(150,420,570,420);

for i:=1 to 10 do begin
moveto(150+i*42,420);
lineto(150+i*42,10);
line(150,10,150,420);
    end;
setcolor(red);
yy:=trunc(4100/gor(20));
t:=0;
tt:=t;
settextstyle(0,0,1);
for i:=1 to 20 do begin
t:=t+1;
tt:=t;
tt:=gor(t);
setlinestyle(0,4,3);
line(150+(i-1)*21,420-trunc(round((gor(t-1)*yy)/10)),150+i*21,420-trunc(round((gor(t)*yy)/10)));

end;
setcolor(white);
      end ;
      end;
      if currI = 3  then
      begin

mp[1]:='ЊҐв®¤ ЎЁбҐЄжЁЁ:';
mp[2]:='ЊҐв®¤ е®а¤:';
mp[3]:='ЊҐв®¤ Їа®бв®© ЁвҐа жЁЁ:';
mp[4]:='ЊҐв®¤ Ќмов®* :';

metodBissekcii (rez[1],shag[1],stx[1],hagi[1]);
metodHord     (rez[2],shag[2],stx[2],hagi[2]);
metodProstoiIteracii  (rez[3],shag[3],stx[3],hagi[3]);
metodNutona   (p,rez[4],shag[4],stx[4],hagi[4]);
for i:=1 to 4 do begin
setcolor (i+5);
outtextxy(1,20*i,mp[i]+'x='+rez[i]+';   ˜ Ј®ў='+shag[i]+';   f(x)='+stx[i]+';');
setcolor (white);
setfillstyle (1,i+5);
bar (100+i*50,300,115+i*50,300-hagi[i]*15);
setfillstyle (1,white);
bar (130,300,320,305);
end;
  menu:=true;
  end;
 if currI = 4 then   halt(1);
  end;
  menu:=false;
  end;
Begin

clrscr;
max:=-32768;
m:=2;
a[1,1]:=4;
a[1,2]:=3;
a[2,1]:=5;
a[2,2]:=1;
b[1]:=6;
b[2]:=2;

m1:=m-1;
for d:=1 to m1 do begin
ak:=a[d,d];
for j:=d to m do a[d,j]:=a[d,j]/ak; b[d]:=b[d]/ak;
d1:=d+1;
for i:=d1 to m do begin
if (a[i,d]<0) or (a[i,d]>0) then aik:=a[i,d]  else continue;
b[i]:=b[i]-b[d]*aik;
for l:=d to m do
a[i,l]:=a[i,l]-a[d,l]*aik; end;end;
d:=m;
1: q[d]:=b[d]/a[d,d];
for j:=1 to m1 do begin i:=m-j;
b[i]:=b[i]-a[i,d]*q[d]; end;
d:=d-1;
if (d-1)>=0 then goto 1;
for i:=1 to 2 do
if abs(q[i])>max then begin max:=q[i];  end;
q[i]:=max; g:=q[i];   writeln('g=',g:2:1);
z[1]:=k;
z[2]:=sin(35*pi/180)/cos(35*pi/180);

  grDriver:=Detect;
  InitGraph(grDriver, grMode, '');
  ErrCode:=GraphResult;
  If ErrCode = grOk Then
  Begin
    currI:=0; currJ:=0;
    metodnutona    (p,rez[4],shag[4],stx[4],hagi[4]);
    z[3]:=p+g;
    menu(' ', true);
    repeat
    v:=readKey;
    until menu(v, false);
    end
  Else WriteLn('Error #', GraphErrorMsg(ErrCode));
  closeGraph;
readkey;
end.
Natashasha вне форума Ответить с цитированием
Старый 30.10.2013, 07:02   #3
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Сразу же вопросы на помнимание:
1) А что программа делает?
2) За что отвечает кусочек кода:
Код:
  if currI > 4 then currI:=1; if currJ > 2 then currJ:=1;
  if currI < 1 then currI:=4; if currJ < 1 then currJ:=2;
?

Вопросы просто потому, что я не верю в написание этой программы Вами.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 30.10.2013, 22:41   #4
Natashasha
 
Регистрация: 29.10.2013
Сообщений: 4
По умолчанию

1) программа рассчитывает заданную функцию различными методами и рисует график
2) данная часть проги служит для циклической(круговой) прокрутки меню
Natashasha вне форума Ответить с цитированием
Старый 31.10.2013, 06:58   #5
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Ок. Поехали потихоньку учиться писать на С++ =)

Начнем с объявления переменных
Код:
 var r,g,max,p:real;
    n:byte;
    ak,aik,t,tt:real;
    a:array[1..2,1..2] of real;
    b,q:array[1..2] of real;
    z:array[1..3]of real;
    i,j,d,d1,m,m1,l,y,gd,gm,yy:integer;
    stx,shag,rez,mp:array[1..4]of string;
    hagi:array[1..4] of integer;
    st,st2,st3,st1:string;
    a2,b2,c2:real;
    grDriver, grMode, ErrCode:integer;
    v:char;
    currI,currJ:integer;
Формат объявления переменных в С++:
Код:
тип_переменной имя_переменной [размер_массива];
Например
Код:
r,g,max,p:real;
на С++ будет выглядеть как
Код:
real:r,g,max,p;
далее рассмотрим объявление массивов
Код:
a:array[1..2,1..2] of real;
для С++ будет выглядеть как
Код:
real a[2][2];
Аналогичным образом преобразуйте остальные объявленные переменные.

Рассмотрим использование дополнительных модулей (в Паскале - юниты)
для с++ указание на них выглядит следующим образом:
Код:
#include <имя_модуля>
или
#include "имя_модуля"
Отличие в том, что при фигурных скобочках <> модуль ищется в глобальных переменных, а при ковычках "" - сначала в локальной папке.
Код:
uses crt, graph;
нужно будет заменить на
Код:
#include "math.h"
Теперь рассмотрим функции
В общем виде функция С++ выглядит так:
Код:
возвращаемый_тип имя_функции(тип_аргумента1 аргумент1, ...)
{
}
Например
Код:
function rt(x:real):real;
begin
end;
на с++ будет выглядеть как
Код:
real rt(real x)
{
}
Далее, отличие, об которое я постоянно запинаюсь по невнимательности. В с++ присвоение переменной обеспечивается простым = вместо :=, а проверка на равенство == вместо =.
Вышеупомянутая функция будет преобразована как
Код:
real rt(real x)
{
rt =0.4 + Arctan(x) - x;
}
Преобразуйте аналогично другие функции.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 01.11.2013, 21:19   #6
Natashasha
 
Регистрация: 29.10.2013
Сообщений: 4
По умолчанию

Код:
//---------------------------------------------------------------------------

#pragma hdrstop
#include <vcl.h>
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{real:r,g,max,p;
byte: n;
real: ak,aik,t,tt;
real a[2][2];
real b,q[2] ;
real  z [3];
int i,j,d,d1,m,m1,l,y,gd,gm,yy;
string: stx,shag,rez,mp[4];
int stx,shag,rez,mp[4];
string: st,st2,st3,st1;
real: a2,b2,c2;
int grDriver, grMode, ErrCode;
char v;
int currI,currJ;

        return 0;
}
//---------------------------------------------------------------------------
получилось так, но когда делаешь проверку функции: real, byte, string в С++ показываются как ошибка

Последний раз редактировалось Stilet; 05.11.2013 в 11:15.
Natashasha вне форума Ответить с цитированием
Старый 05.11.2013, 08:23   #7
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Так. Я накосячил, объявляются переменные без двоеточия, т.е.
Код:
int a; int b,c;
и т.п.
Дальше. Возможно, для использования типа string понадобиться сделать
Код:
#include <string.h>
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу в Turdo Pascal которая вычисляет значение функции в виде графика Nirvanaaa Помощь студентам 1 22.06.2013 11:42
Pascal. Требуется разработать программу для построения на экране графика функции f(X) igagogi Помощь студентам 0 23.12.2012 18:59
Задача по построению графика! Анастасия12 Помощь студентам 0 21.09.2012 16:52
переделать программу под процедуры и функции graf890 Помощь студентам 0 21.02.2011 20:41