• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Диалоговый режим

Хелен

Sparkling
Регистрация
28 Сен 2010
Сообщения
98
Реакции
2
Баллы
0
Диалоговый режим

Такая вечная моя проблема))) Прогу пишу, а до идеала довести не могу.
Помогите доделать.

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

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.

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

Вложения

  • прог витал.webp
    прог витал.webp
    13.1 KB · Просмотры: 62
Диалоговый режим подразумевает влияние человека на ход вычислений. Для данной задачи диалог может заключаться в запросе с клавиатуры начального, конечного значений x и дельта x, а выходной диалог - в выводе результатов вычислений в виде таблицы значений. Соответственно, тут же нужно будет предусмотреть диалог сообщения об ошибки вычислений.
 
Т.е. фактически всё правильно?
 
Остальное - неправильно сделано, листинг не подходит к заданию.

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

Судя по всему, вы совершенно не представляете себе сути задания и не видите способов решения.
 
Я не своё условие вам нечаянно выложила. Цифры тут не важны, Важен факт, алгоритм работы чтобы был правилен.
 
Невозможно судить о правильности алгоритма, не имея перед глазами условия задачи. Если оно совпадает с выложенным - вам не хватает цикла.
 
Вот 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 хватается за волидол .
Нет. Валидол мне не нужен - я спокоен, как форель в озере. И абсолютно спокойно, хоть и с сожалением, отправляю Вас, сударь, в вечный бан. Потому что не намерен терпеть дальше Ваши выходки. Как говорится, Господь свидетель - я сделал всё возможное, чтобы не доводить ситуацию до подобной крайности: пытался Вас увещевать, взывал к чувству ответственности, чуть не умолял не выкладывать сырые неотлаженные программы с кучей ошибок... Тщетно. Так что, дорогой троллёныш, увы: Вы мне выбора не оставляете.

Напоследок разберем Ваши очередные изделия.
Вариант 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. И шаг может быть дробным - почему нет?
А вот дальше пошла ахинея.
То есть если число либо отрицательно, либо меньше 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.
Требуется вывести таблицу значений функции для всего диапазона значений аргумента, а Вы выводите только последнее.

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

Прощайте.

Ну а мне, увы, придется, исключительно в видах поддержания репутации форума, выложить решение задачки. В следующем посте.
 
Теперь по задаче.
Прежде всего - мною обнаружена ошибка в условии. Рассмотрим, например, значения функций при х=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.
 
Извиняюсь сейчас нет времени проверить ваш вариант.
Мною программа завершена, если хотите, выложу позднее свой вариант на ваше рассмотрение. =)
 
Извиняюсь сейчас нет времени проверить ваш вариант.
Мною программа завершена, если хотите, выложу позднее свой вариант на ваше рассмотрение. =)
Хочу! Рассмотрим...
 
Вот конечный вариант программы - принят на ура))

Основная программа:
Код:
uses crt,zad2;
var
i,r:integer;
begin
for i := 1 to 100 do
begin
writeln;
writeln('1 - Zadacha №1, 2 - Zadacha №2, 3 - Exit');
read(r);
case r of
1:begin
zad11(zad2.x);
end;
2:begin
zad1(zad2.z);
writeln;
end;
3:exit;
end;
end;
end.

Модуль:
Код:
unit zad2;
 interface
var
 i,n,s,i1,d:integer;
 x,z:real;
 p:string;
 a:array[1..1000] of integer;
 b:array[1..1000] of integer;
 Procedure zad1(var x:real);
 Procedure zad11(var x:real);
 implementation
 
Procedure zad1(var x:real);
begin
writeln('vvedite n= ');
read(n);
x:=0;
for i:=1 to n do
x:=(-1)/(2*n+1)*n;
if n mod 2 = 0 then
x:=x*(-1);
writeln('x=',x:8:4);
end;
 Procedure zad11(var x:real);
 var
 y1,y2,y3,y4,n,h:real;
 i,x1,x2,r,q:integer;
 begin
  x:=0;
writeln('vvedite x1,x2,h:');
read(x1,x2,h);
writeln('     Shag          Argument             Otvet');
for i:=1 to 1000 do
begin
if(x>x2)
then
break;
x:=x1+((i-1)*h);
if(x<=0)
then
p:='Не определена на оси ОХ';
if(x>=0) and (x<=5)
then
begin
p:='Принадлежит оси 0<x<5';
y1:=(3*x*x+2*x)/(2*exp(x));
y2:=(2*y1*cos(x)*cos(x)*cos(x));
z:=y1*y1+y2;
z:=z+z;
end;
if(x>5)
then
begin
p:='Принадлежит оси x>5';
y3:=x+x*cos(x);
y4:=(y3*cos(x)*cos(x));
z:=y3*y3+y4;
z:=z+z;
end;
if (x>x2) then
writeln ('')
else
begin
if(x<=0)
then
writeln(' ',x:8:2,'     ',p)
else
writeln(' ',x:8:2,'     ',p,'    ',z:8:2);
end;
end;
 end;
end.

Вот так красиво это всё выглядит:
 

Вложения

  • Безымянный.webp
    Безымянный.webp
    23.2 KB · Просмотры: 64
Вот конечный вариант программы - принят на ура))
Ну и прекрасно - поздравляю! А мне еще, увы - учиться и учиться. Потому что с моими скудными знаниями уразуметь смысл сентенции
не представляется возможным.
"Пойду, забудусь сном" © М.Булгаков.
 
Сколько бы нам ни было, а жизни нам ещё учиться и учиться... :tehnari_ru_942:
 
Назад
Сверху