Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите соединить две задачи на Паскале (http://www.tehnari.ru/f41/t48610/)

FPS 09.03.2011 20:14

Помогите соединить две задачи на Паскале
 
Вложений: 1
Всем доброго времени суток, очень нужна помощь с контрольной по программированию, завтра сдавать.. Уже есть 2 программы, их нужно както соединить в одну и ещё подредактировать первую, там почемуто после ввода чисел пишет ошибку =(

Вот как звучит задание:
Вложение 140344

Вот код первой программы:
Цитата:

program z21;
Uses crt;
var x1,x2,x,dx,l:integer;
y1,y2,z:real;
begin
clrscr;
L:=0;
Writeln('vvedite x1, x2 and dx');
Readln(x1,x2,dx);
for x:=x1 to x2 do
begin
l:=l+1;
If (l=dx) then
begin
if (x<2) then
y1:=(3*x*x+2*x+5)/2*exp(-x)
else
if (x>=2)and(x<6) then
y1:=x+cos(x)
else
begin
Writeln(' Error input x ');
exit;
end;
y2:=2*y1+x*x;
z:=2*sqr(y1)+y2;
Writeln('output: z=',z:5:2);
l:=0;
end;
end;
readln;
end.
Вот вторая:
Цитата:

program z22;
uses crt;
var i,n:integer;
A:array[1..100] of real;
b:array[1..100] of real ;
begin
clrscr;
Writeln('vvedite dlinu massiva');
readln(n);
if (n<=0) then
begin
Writeln ('Error');
exit;
end;
Writeln('vvodite');
for i:=1 to n do
Readln(a[i]);
Writeln('outpet');
For i:=1 to n do
if a[i]<0 then
b[i]:=abs(a[i])
else
b[i]:=a[i];
For i:=1 to n do
Writeln(b[i]);
readln;
end.

Vladimir_S 09.03.2011 21:37

Нет, первый код - категорически никуда не годится! Кто Вам сказал, что переменная х может принимать только целочисленные значения? Потому что так проще цикл программировать? Не пойдет. В задании дана вещественная функция вещественного аргумента, и нечего тут упрощать. Решить задачку можно, например, так:
Код:

VAR
 Xmin,Xmax,Dx,x:Real;
 i,N:Integer;

Function Y1(x1:Real):Real;
begin
 if x1<2 then Y1:=(x1*x1*3+x1*2+5)/2/Exp(-x1)
 else Y1:=x1+Cos(x1);
end;

Function Y2(x2:Real):Real;
 begin
  Y2:=Y1(x2)*2+x2*x2;
 end;

Function Z(x3:Real):Real;
 begin
  Z:=Y1(x3)*2+SQR(x3);
 end;

BEGIN
 Write('Xmin = ');
 ReadLn(Xmin);
 Write('Xmax (<6) = ');
 ReadLn(Xmax);
 Write('Dx = ');
 ReadLn(Dx);
 N:=ROUND((Xmax-Xmin)/Dx);
 For i:=0 to N do
  begin
  x:=Xmin+Dx*i;
  WriteLn(x:5:2, Z(x):12:3);
  end;
 ReadLn;
END.

Что касается второй программы, то вроде явных ошибок там нет, но сделана она просто безобразно неряшливо и неудобно. Особенно с оператором exit - вообще ни в какие ворота не лезет. Потому предлагаю такой вариант:
Код:

program z22;
uses crt;
var
 i,n:integer;
 A:array[1..100] of real;
 b:array[1..100] of real ;
begin
 clrscr;
 Repeat
  Write('Vvedite dlinu massiva ');
  readln(n);
  if (n<=0) or (n>100) then
  Writeln ('Error!');
 Until (n>0) and (n<101);
 Writeln('Vvodite:');
 for i:=1 to n do
  begin
  Write('a[',i:2,']= ');
  Readln(a[i]);
  end;
 Writeln('Input:');
 for i:=1 to n do
  Write(a[i]:8:3);
 Writeln;
 Writeln('Output:');
 for i:=1 to n do
  b[i]:=abs(a[i]);
 for i:=1 to n do
  Write(b[i]:8:3);
 Writeln;
 readln;
end.

Что касается объединения программ - решительно не понимаю, зачем и кому это нужно: они ведь никак не связаны. Ну сделайте из них две процедуры без параметров и поставьте в начале запрос, какую из двух запускать, а потом ветвление. Можно, конечно...

FPS 09.03.2011 22:14

Спасибо Вам большое :tehnari_ru_288: С этой контрольной помогли, ещё и денег хотели содрать) А на счёт объединения, препод зачемто требует) буду пробовать =)


Часовой пояс GMT +4, время: 21:49.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.