Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 11.02.2011, 22:40   #1 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию Диалоговый режим

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

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

Код 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.
Само задание выглядит так:
Миниатюры
idhia-aeoae.png  
Хелен вне форума   Ответить с цитированием

Старый 11.02.2011, 22:40
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Поищите информативные ответы в похожих темах

Ждущий режим
Полноэкранный режим
Спящий режим

Старый 12.02.2011, 10:01   #2 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Диалоговый режим подразумевает влияние человека на ход вычислений. Для данной задачи диалог может заключаться в запросе с клавиатуры начального, конечного значений x и дельта x, а выходной диалог - в выводе результатов вычислений в виде таблицы значений. Соответственно, тут же нужно будет предусмотреть диалог сообщения об ошибки вычислений.
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 13.02.2011, 10:04   #3 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

Т.е. фактически всё правильно?
Хелен вне форума   Ответить с цитированием
Старый 14.02.2011, 09:34   #4 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

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

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

Судя по всему, вы совершенно не представляете себе сути задания и не видите способов решения.
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 15.02.2011, 13:41   #5 (permalink)
Хелен
Sparkling
 
Аватар для Хелен
 
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 15.02.2011, 14:39   #6 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Невозможно судить о правильности алгоритма, не имея перед глазами условия задачи. Если оно совпадает с выложенным - вам не хватает цикла.
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 26.02.2011, 15:04   #7 (permalink)
Mr.Програмист
Banned
 
Регистрация: 25.01.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Щас подшаманим Vladimir S хватается за волидол .
Mr.Програмист вне форума   Ответить с цитированием
Старый 26.02.2011, 15:53   #8 (permalink)
Mr.Програмист
Banned
 
Регистрация: 25.01.2011
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Вот 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.
Mr.Програмист вне форума   Ответить с цитированием
Старый 27.02.2011, 19:22   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Mr.Програмист Посмотреть сообщение
Щас подшаманим 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   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Теперь по задаче.
Прежде всего - мною обнаружена ошибка в условии. Рассмотрим, например, значения функций при х=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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.