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

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Диалоговый режим (http://www.tehnari.ru/f43/t47347/)

Хелен 11.02.2011 22:40

Диалоговый режим
 
Вложений: 1
Такая вечная моя проблема))) Прогу пишу, а до идеала довести не могу.
Помогите доделать.

Необходимо написать программу в диалоговом режиме с модулями.
Вот мой математический код.

Код HTML:

Program Hel;
uses crt;
var
y1,y2,y3,y4,z,x,c1:real;
c:integer;
begin
writeln('vvedite x:');
read(x);
z:=0;
y3:=0;
if 3<=x
then
c1:=1;
if x<=9
then
c1:=c1+1;
if c1=2
then
begin
writeln('Formula №1');
y1:=(2*x*x+3*x+1)/(x+cos(x)*cos(x));
y2:=(2*sin(x))*(sin(x));
z:=y1*y1+y2;
end
else
if x>
9
then
begin
writeln('Formula №2');
y3:=(sin(x)/cos(x)+x+exp(-x));
y4:=(2*sin(x))*(sin(x));
z:=y3*y3+y4;
end
else
writeln('error argument interval');
writeln('z=',z:8:2);
end.

Само задание выглядит так:

AlexZir 12.02.2011 10:01

Диалоговый режим подразумевает влияние человека на ход вычислений. Для данной задачи диалог может заключаться в запросе с клавиатуры начального, конечного значений x и дельта x, а выходной диалог - в выводе результатов вычислений в виде таблицы значений. Соответственно, тут же нужно будет предусмотреть диалог сообщения об ошибки вычислений.

Хелен 13.02.2011 10:04

Т.е. фактически всё правильно?

AlexZir 14.02.2011 09:34

Остальное - неправильно сделано, листинг не подходит к заданию.

1) Условие нужно составлять, исходя из значений переменных. Выражение 3<=x неверно, так как нельзя сравнивать число с переменной, можно только обратно, переменную с числом, вот так правильно: if x>=3 ...
Совершенно непонятно, откуда вы взяли числа 3 и 9, если у вас по заданию Х должен быть >=0 но <=5 для первого варианта и >5 для второго варианта уравнения y1 системы.
2) Функции совершенно не подходят для вашего задания.
3) Нет изменения значения переменной X от начального до конечного с указанным приращением. Нет вывода вычисленного значения Z.
4) IMHO, легче написать программу с нуля, чем пытаться исправить предложенный листинг.

Судя по всему, вы совершенно не представляете себе сути задания и не видите способов решения.

Хелен 15.02.2011 13:41

Я не своё условие вам нечаянно выложила. Цифры тут не важны, Важен факт, алгоритм работы чтобы был правилен.

AlexZir 15.02.2011 14:39

Невозможно судить о правильности алгоритма, не имея перед глазами условия задачи. Если оно совпадает с выложенным - вам не хватает цикла.

Mr.Програмист 26.02.2011 15:04

Щас подшаманим Vladimir S хватается за волидол .

Mr.Програмист 26.02.2011 15:53

Вот 2 варианта решения который верен логически выбирайте сами.
Код:

Program Hel;
uses crt;
Var t,a,z,y1,y2:real;
i,x1,x2,x:integer;
Begin
Writeln('Введите x begin');
Readln(x);
Writeln('Введите x end');
Readln(x1);
Writeln('Введите шаг х');
Readln(x2);
if ((x<=0) or (x<=5))
then begin
for i:=x to x1 do
begin
if x>x1
then break;
y1:=((3*sqr(x)+(2*x))/(2*exp(x)));
y2:=(2*y1*cos(x)*cos(x)*cos(x));
z:=(sqrt(sqr(y1)+y2));
x:=x+x2-1;
end;
 end
else
begin
for i:=x to x1 do
begin
if x>x1
then break;
y1:=((5*x)+(sqr(x)*cos(x)));
y2:=(2*y1*cos(x)*cos(x)*cos(x));
z:=(sqrt(sqr(y1)+y2));
x:=x+x2-1;
end;
end;
Writeln('функция равна',z:3:10);
Readln;
end.

Код:

Program Hel;
uses crt;
Var t,a,z,y1,y2:real;
i,x:integer;
Begin
Writeln('Введите x begin');
Readln(x);
if ((x<=0) or (x<=5))
then begin
y1:=((3*sqr(x)+(2*x))/(2*exp(x)));
y2:=(2*y1*cos(x)*cos(x)*cos(x));
z:=(sqrt(sqr(y1)+y2));
end
else
begin
y1:=((5*x)+(sqr(x)*cos(x)));
y2:=(2*y1*cos(x)*cos(x)*cos(x));
z:=(sqrt(sqr(y1)+y2));
end;
Writeln('Функция равна ',z:3:10);
Readln;
end.


Vladimir_S 27.02.2011 19:22

Цитата:

Сообщение от Mr.Програмист (Сообщение 474455)
Щас подшаманим Vladimir S хватается за волидол .

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

Напоследок разберем Ваши очередные изделия.
Вариант 1:
Цитата:

Program Hel;
uses crt;
Var t,a,z,y1,y2:real;
i,x1,x2,x:integer;
Begin
Writeln('Введите x begin');
Readln(x);
Writeln('Введите x end');
Readln(x1);
Writeln('Введите шаг х');
Readln(x2);
Пока всё верно. За исключением выбора формата аргумента функции (Integer) - по логике, он должен быть Real. И шаг может быть дробным - почему нет?
А вот дальше пошла ахинея.
Цитата:

if ((x<=0) or (x<=5))
То есть если число либо отрицательно, либо меньше 5? Бред!
Цитата:

then begin
for i:=x to x1 do
begin
if x>x1
then break;
y1:=((3*sqr(x)+(2*x))/(2*exp(x)));
y2:=(2*y1*cos(x)*cos(x)*cos(x));
z:=(sqrt(sqr(y1)+y2));
x:=x+x2-1;
end;
Цикл построен абсолютно безграмотно. Число проходов должно быть (х1-х)/х2, а у Вас оно (х1-х). Не говоря уже о бессмыслице x:=x+x2-1.
Цитата:

Writeln('функция равна',z:3:10);
Readln;
end.
Требуется вывести таблицу значений функции для всего диапазона значений аргумента, а Вы выводите только последнее.

Думаю, разбирать второй аналогичный "шедевр" - смысла нет.

Прощайте.

Ну а мне, увы, придется, исключительно в видах поддержания репутации форума, выложить решение задачки. В следующем посте.

Vladimir_S 27.02.2011 20:18

Теперь по задаче.
Прежде всего - мною обнаружена ошибка в условии. Рассмотрим, например, значения функций при х=2.5:
у1=0.9748
у2=-1.0024
Таким образом, при вычислении функции z, подкоренное выражение есть
у1*у1+у2=-0.0523, т.е. оно ОТРИЦАТЕЛЬНО, а значит при выполнении программы неизбежно возникнет ошибка.
Как я предполагаю, скорее всего там опечатка, и под корнем стоит, например, сумма квадратов у1 и у2. Если так, то:
Код:

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

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

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

Function Z(x3:Real):Real;
 begin
  Z:=SQRT(SQR(Y1(x3))+SQR(Y2(x3)));
 end;

BEGIN
 Write('Xmin (>=0) = ');
 ReadLn(Xmin);
 Write('Xmax (>5) = ');
 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.



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

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