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

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

Olga89 15.08.2011 19:53

Задание в Pascal. Подскажите
 
Вложений: 1
Здравствуйте! :)
Помогите, пожалуйста, решить задачку в паскале. Сама не могу разобраться, а подсказать не кому (учусь заочно, 1курс).

Задание: Вычислить значение функции f в точке х. Значение х должно вводиться с клавиатуры. Вывести полученный результат на экран.
Вложение 46878

Вот мой вариант решения. Думаю, что тело программы написано верно, но выдает ошибку в значениях х < 3 и х = 3. Наверно, я неправильно перевела выражения( Здесь я абсолютно запуталась! Помогите пожалуйста!:tehnari_ru_121:

program k_work_1;
var
x, f : real;
begin
writeln ('введите x');
readln (x);
if x<3 then f:=sqrt(exp(ln(x)*6)-6*(exp(ln(x)*4)+1)-x*x);
if x=3 then f:=ln(cos(x)/sin(x)*((6*x-x*x)/8));
if x>3 then f:=exp(x*x-4)-1;
writeln ('f=', f);
readln;
end.

Vladimir_S 15.08.2011 21:15

Цитата:

Сообщение от Olga89 (Сообщение 569791)
Вот мой вариант решения. Думаю, что тело программы написано верно, но выдает ошибку в значениях х < 3 и х = 3. Наверно, я неправильно перевела выражения( Здесь я абсолютно запуталась! Помогите пожалуйста!

И это, и не только. Вы абсолютно неправильно ввели второе условие, тут я поправил (см. ниже). А вот что касается первого и третьего, то тут, извините за грубость, явный брёх в самом задании. Давайте разберемся.
1. В первом условии для начала, ввиду отсутствия вертикального штришка на конце знака радикала, неясно, докуда он тянется, т.е. накрывает он х^2 или нет. Ну ладно, будем исходить из того, что накрывает и все четыре слагаемых находятся под корнем. Но в любом случае, достаточно подставить значение х<3 (например, х=1), чтобы убедиться, что выражение под знаком радикала будет отрицательным. Отсюда и ошибка.
2. В третьем условии стоИт очень быстро нарастающая функция, которая почти сразу, т.е. даже при сравнительно небольших значениях х (в пределах 10) вылетит за границы разрядной сетки.

Исходя из приведенного анализа, имею предложить вариант программы, в котором:
1. Исправлено второе условие.
2. Обменены местами знаки неравенств первого и третьего условий. Почти уверен, что так и предполагалось - просто опечатка. При таких (исправленных) неравенствах никаких ошибок и аномально больших значений не возникает.
3. Вывод значения функции сделан форматным - просто для красоты.

Код:

program k_work_1;
var
 x,y,f : real;
begin
 writeln ('введите x');
 readln (x);
 if x>3 then f:=sqrt(exp(ln(x)*6)-6*(exp(ln(x)*4)+1)-x*x);
 if x=3 then
  begin
  y:=(6*x-x*x)/8;
  f:=ln(cos(y)/sin(y));
  end;
 if x<3 then f:=exp(x*x-4)-1;
 writeln ('f= ', f:0:5);
 readln;
end.


Olga89 16.08.2011 16:43

Vladimir_S, Спасибо Вам огромное за помощь!
Во втором выражении я поняла свою ошибку) Мне следовало быть чуть-чуть внимательней и сей час не было бы так стыдно=) По поводу опечатки я бы конечно сама не разобралась.
Спасибо Вам еще раз!

Vladimir_S 16.08.2011 17:18

Цитата:

Сообщение от Olga89 (Сообщение 570288)
Спасибо Вам еще раз!

Да не за что. Заходите, обращайтесь - чем можем...

Olga89 11.09.2011 18:35

Здравствуйте!:)
Что бы не создавать новую тему спрошу здесь, если ни кто не против.
Не могу решить задачу с оператором цикла Repet, в строке «until i>10;» выдает ошибку «Ожидается логическое выражение» Помогите пожалуйста! Что не хватает?:tehnari_ru_117:

Задача: Вычислить сумму s значений функции f в точках xi которые берутся с заданного интервала [a;b] через равные отрезки длиной h. Длина отрезка рассчитывается по формуле h=(b-a)/(n-1) . Здесь i=1,2,3…n - номер точки; n - задаваемое количество точек; a - начло и b - конец интервала изменения x. Вывести на экран результаты вычислений.

program prog_1;
const a=10; b=11; n=10;
var s, x, h : real;
i : integer;
begin
h:=(b-a)/(n-1);
writeln ('a= a',a);
writeln ('b= b',b);
writeln ('n= n',n);
writeln ('h= h',h:0:8);
writeln;
x:=a;
s:=0;
i:=1;
repeat s:=s+(sin(x))/sqr(x+2);
x:=x+h;
i:=i+1;
until i>10;
writeln (s:0:8);
end.

С уважением!

Gruvi 11.09.2011 19:10

Операторы цикла это =) (я конечно не про.... но вот)

Program prog2;
const
a=3;
b=10;
n=10;
var s,x,h:real;
i:integer;
begin
writeln('Вычисление суммы значений функции');
h:=(b-a)/(n-1);
writeln(' a = ',a);
writeln(' b = ',b);
writeln(' n = ',n);
writeln(' h = ',h:0:8);
writeln;
{цикл "while"}
writeln('1. Цикл "while"');
x:=a;
s:=0;
i:=1;
while i<=10 do
begin
s:=s+sin(x+3)/exp(2/5*ln(x+3));
x:=x+h;
i:=i+1;
end;
write(' Значение s: ');
writeln(s:0:8);
{цикл "repeat"}
writeln('2. Цикл "repeat"');
x:=a;
s:=0;
i:=1;
repeat
s:=s+sin(x+3)/exp(2/5*ln(x+3));
x:=x+h;
i:=i+1;
until i>10;
write(' Значение s: ');
writeln(s:0:8);
{цикл "for ... to ... do"}
writeln('3. Цикл "for ... to ... do"');
x:=a;
s:=0;
for i:=1 to 10 do
begin
s:=s+sin(x+3)/exp(2/5*ln(x+3));
x:=x+h;
end;
write(' Значение s: ');
writeln(s:0:8);
{цикл "for ... downto ... do"}
writeln('4. Цикл "for ... downto ... do"');
x:=a;
s:=0;
for i:=10 downto 1 do
begin
s:=s+sin(x+3)/exp(2/5*ln(x+3));
x:=x+h;
end;
write(' Значение s: ');
writeln(s:0:8);
readln;
End.

Vladimir_S 11.09.2011 19:18

Цитата:

Сообщение от Olga89 (Сообщение 584996)
в строке «until i>10;» выдает ошибку «Ожидается логическое выражение» Помогите пожалуйста! Что не хватает?

Ошибок нет. Вероятно, какие-то "задвиги" или транслятора, или компа. Для проверки слегка "подчистил" Вашу программу, исправив не очень существенные огрехи. Проверял в таком виде:
Код:

program prog_1;
const
 a=10.0;
 b=11.0;
 n=10;
var
 s, x, h : real;
 i : integer;
begin
 h:=(b-a)/(n-1);
 writeln ('a= ',a:0:3);
 writeln ('b= ',b:0:3);
 writeln ('n= ',n);
 writeln ('h= ',h:0:8);
 writeln;
 x:=a;
 s:=0;
 i:=1;
 repeat
  s:=s+(sin(x))/sqr(x+2);
  x:=x+h;
  i:=i+1;
 until i>10; 
 writeln ('s= ',s:0:8);
 readln;
end.

Вот чего не понимаю, так это зачем тут применять цикл Repeat-Until, когда можно обойтись простым For...to...do? С ним такой вариант:

Код:

program prog_1;
const
 a=10.0;
 b=11.0;
 n=10;
var
 s, x, h : real;
 i : integer;
begin
 h:=(b-a)/(n-1);
 writeln ('a= ',a:0:3);
 writeln ('b= ',b:0:3);
 writeln ('n= ',n);
 writeln ('h= ',h:0:8);
 writeln;
 s:=0;
 for i:=1 to n do
  begin
  x:=a+h*(i-1);
  s:=s+(sin(x))/sqr(x+2);
  end;
 writeln ('s= ',s:0:8);
 readln;
end.


Olga89 11.09.2011 21:20

Цитата:

Сообщение от Gruvi (Сообщение 585032)
Операторы цикла это =) (я конечно не про.... но вот)

Gruvi, спасибо конечно, но Вы действительно не про! :) Ваш код к моему заданию не имеет никакого отношения

Olga89 11.09.2011 21:28

Vladimir_S, спасибо большое! Вы снова меня выручили! :)
Ваш вариант работает без ошибок и выдает верное значение "s"!
Действительно, можно использовать и цикл For...to...do как я и сделала, просто не стала об этом писать. По условию задачи необходимо получить одинаковый результат различными способами.
Спасибо Вам :tehnari_ru_657:


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

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