Код большой? Выложи, если не жалко.
Или повтори ошибку в другом, который не жалко показать общественности.
p.s. А, черт. "Сорвал" счетчик. Такая цифра была.
..bw
Модератор: Модераторы
program Termo_areas;
uses CRT,math;
type
cub=record
v,c,lambda,p_ist: Real;
end;
buf=array[1..6] of Real;
const
c_vozd=1299; lambda_vozd=0.026;
var
l,w,h: Real;
ln,wn,hn,i,j,k,num,g: Word;
lcub,wcub,hcub,vcub,temp0,time,t_step,t,ixp,ixm,iyp,iym,izp,izm: Real;
temp: array [1..100,1..100,1..100] of Real;
cubic: array [1..100,1..100,1..100] of cub;
c_num,v_num,lambda_num: buf;
ch: Char;
function h_i(n:Word; a:buf):Real;
var
l: Word;
s1,s2: Real;
begin
s1:=0; s2:=0;
if n=1 then h_i:=power(a[1],1/3) else
begin
for l:=n downto 2 do
begin
s1:=s1+a[l];
s2:=s2+a[l-1];
end;
s1:=s1+a[1];
h_i:=power(s1,1/3)-power(s2,1/3);
end;
end;
function lam_i(n:Word; vc:Real; v,lam:buf): Real;
var
l:Word;
p,lp,ls: Real;
begin
p:=0; lp:=1; ls:=0;
for l:=1 to n do lp:=lp*lam[l];
for l:=1 to n do ls:=ls+lp*h_i(l,v);
for l:=1 to n do p:=p+(sqr(h_i(l,v))*lp);
lam_i:=p/(ls*power(vc,1/3));
end;
begin {Начало программы}
repeat {Ввод общих данных о модели}
ClrScr;
Write('Введите длину: '); Read(l);
Write('Введите ширину: '); Read(w);
Write('Введите высоту: '); Read(h);
Writeln('---------------------------------------');
Write('Введите количество разбиений по длине: '); Read(ln);
Write('Введите количество разбиений по ширине: '); Read(wn);
Write('Введите количество разбиений по высоте: '); Read(hn);
Writeln('---------------------------------------');
lcub:=l/ln; wcub:=w/wn; hcub:=h/hn; vcub:=lcub*wcub*hcub;
Writeln('Размеры элементарного объёма: ', lcub:5:3,' x',wcub:5:3,' x',hcub:5:3); Writeln;
Write('Введите начальную температуру блока= '); read(temp0);
Writeln;
Writeln('Enter - ввод данных, Esc - ввести заново');
ch:=Readkey;
until Ord(ch)=13;
for i:=1 to ln+2 do
begin
for j:=1 to wn+2 do
begin
for k:=1 to hn+2 do
begin
temp[i,j,k]:=temp0;
cubic[i,j,k].c:=c_vozd;
cubic[i,j,k].lambda:=lambda_vozd;
end;
end;
end;
for k:=2 to hn+1 do {Ввод данных для каждого "кубика"}
begin
for i:=2 to ln+1 do
begin
for j:=2 to wn+1 do {начало}
begin
Clrscr;
Writeln('Координаты элемента (x,y,z): ',i-1,' ',j-1,' ',k-1);
Write('Введите количество материалов в элементе(максимум 5) = '); Read(num);
for g:=1 to num do
begin
repeat
Writeln;
Writeln('Материал №',g);
Writeln('============================');
Write('Удельная теплоёмкость='); Read(c_num[g]);
Write('Коэффициент теплопроводности='); Read(lambda_num[g]);
Write('Объём материала в элементе='); Read(v_num[g]);
Writeln('----------------------------');Writeln;
Write('Enter - ввод данных, Esc - ввести заново');
ch:=Readkey;
until Ord(ch)=13;
end;
Writeln;
Write('Введите мощность источников тепла='); Read(cubic[i,j,k].p_ist);
cubic[i,j,k].v:=0;
for g:=1 to num do begin cubic[i,j,k].v:=cubic[i,j,k].v+v_num[g]; end;
cubic[i,j,k].c:=((vcub-cubic[i,j,k].v)*c_vozd)/vcub;{Слагаемое экв. теплоёмкости для заполнителя(воздух)}
for g:=1 to num do cubic[i,j,k].c:=cubic[i,j,k].c+(v_num[g]*c_num[g])/vcub;{Вычисление экв. теплоёмкости}
cubic[i,j,k].lambda:=lam_i(num,vcub,v_num,lambda_num); {Вычисление экв. коэфф-та теплопроводности}
end; {конец}
end;
end;
repeat
Writeln;
Write('Введите время наблюдения, с: '); read(time);
Write('Введите шаг времени, с: '); read(t_step); Writeln;
Write('-----------------------------');
Write('Enter - ввод данных, Esc - ввести заново');
ch:=Readkey;
until ord(ch)=13;
t:=0;
repeat
for k:=1 to hn+1 do
begin
for i:=1 to ln+1 do
begin
for j:=1 to wn+1 do
begin
ixp:=((cubic[i,j,k].lambda+cubic[i+1,j,k].lambda)*t_step)/(2*sqr(lcub)*cubic[i,j,k].c)*(temp[i+1,j,k]-temp[i,j,k]);
ixm:=((cubic[i,j,k].lambda+cubic[i+1,j,k].lambda)*t_step)/(2*sqr(lcub)*cubic[i,j,k].c)*(temp[i,j,k]-temp[i-1,j,k]);
iyp:=((cubic[i,j,k].lambda+cubic[i,j+1,k].lambda)*t_step)/(2*sqr(wcub)*cubic[i,j,k].c)*(temp[i,j+1,k]-temp[i,j,k]);
iym:=((cubic[i,j,k].lambda+cubic[i,j+1,k].lambda)*t_step)/(2*sqr(wcub)*cubic[i,j,k].c)*(temp[i,j,k]-temp[i,j-1,k]);
izp:=((cubic[i,j,k].lambda+cubic[i,j,k+1].lambda)*t_step)/(2*sqr(hcub)*cubic[i,j,k].c)*(temp[i,j,k+1]-temp[i,j,k]);
izm:=((cubic[i,j,k].lambda+cubic[i,j,k+1].lambda)*t_step)/(2*sqr(hcub)*cubic[i,j,k].c)*(temp[i,j,k]-temp[i,j,k-1]);
temp[i,j,k]:=temp[i,j,k]+(c_vozd/cubic[i,j,k].c)*(ixp-ixm+iyp-iym+izp-izm)+((cubic[i,j,k].p_ist*t)/cubic[i,j,k].c);
end;
end;
end;
t:=t+t_step;
until t>time;
repeat
Clrscr;
Writeln;
Write('Введите номер слоя по координате Z (высота): ');Read(num);
for i:=1 to ln+2 do
begin
for j:=1 to wn+2 do
begin
write(temp[i,j,num]:5:4);
end;
Writeln; Writeln;
end;
Writeln('-----------------------------');
Writeln('Enter - вывод следующего слоя, Esc - выход');
ch:=Readkey;
until ord(ch)=27;
end.{Конец программы}
Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5