Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Образовательный студенческий форум _ Информатика / Программирование _ Программирование в Турбо Паскале

Автор: Марина Игоревна 18.7.2010, 6:05

Добрый день. Необходимо составить программу для вычисления и вывода вычисленного значения на принтер и экран дисплея в виде: Функция равна <числовое значение>.

z=x^2+(|1+y|)^{1/2},

где у= a^2+b^2, если a^2<b^2,
-12.8, если a^2=b^2,
a, если a^2>b^2.

Программа:

Program kz1;
Uses Printer;
Var
a,b,x,y,z: real;
begin
writeln ('введите число а,b');
read(y);
if sqr(a)<sqr(b) then y:=sqr(a)+sqr(b);
if sqr(a)=sqr(b) then y:=-12.8;
if sqr(a)>sqr(b) then y:=a;
write('y=',y);
writeln (введите число х);
read(z);
if y=sqr(a)+sqr(b) then z:=sqr(x)+sqrt(abs(1+sqr(a)+sqr(b)));
if y=12.8 then z:=sqr(x)+sqrt(abs(1-12.8));
if y=a then z:=sqr(x)+sqrt(abs(1+a));
write('z=',z);
end.

Проверьте, пожалуйста, верно ли я составила программу, точнее алгоритм?

Автор: граф Монте-Кристо 18.7.2010, 8:02

По алгоритму - последние три иф'а немного не понятны. Зачем они вообще? Не проще просто подставить у и х в заданную функцию?
По реализации - много ошибок. printer - для вывода на принтер? Если так, то Вы это нигде не используете. Потом, вводите а и b, а считываете зачем-то в одну переменную, да ещё и в у. В общем, ещё разбираться и разбираться.

Автор: Марина Игоревна 11.9.2010, 13:56

Добрый вечер. Разбиралась с паскалем. Вот что получилось:
http://www.radikal.ru
http://www.radikal.ru
Еще необходимо по усмотрению выбрать числовые значения , ввести их с клавиатуры и определить какая ветвь вычислений "проработает" при введенных значениях. Это просто можно будет записать числа и указать какая ветвь сработает?

Автор: Vahappaday 11.9.2010, 16:21

угу)) теперь как-то так)) Хотя и if'ы немного необычно расположены, но всё будет работать))

Как проверять - зависит от преподавателя.... Как на мой вкус, Вашей проверки вполне достаточно...

Программку проверяли сами, работает?

Автор: Марина Игоревна 12.9.2010, 2:22

Да, проверяла) Работает, просто оценка со стороны знающих людей мне не помешает, тем более что университет за 400 км от меня, к педагогу точно не скоро попаду. Спасибо Вам smile.gif

Автор: Марина Игоревна 13.9.2010, 13:20

Добрый вечер. Еще одна задача. Не могли бы Вы ее проверить?
Задача:
Составить две программы вычисления и вывода на принтер значений аргумента и функции y=f(x). Первая программа вычисляет у для х, изменяющегосяв заданном интервале с указанным шагом х. Во второй программе значения аргумента задаются массивом. В первой программе цикл организовать с помощью условного оператора FOR, во второй - с использованием оператора цикла DO.
x^3+2sin^2*(x+3)^2
а)0(<=)x(<=)5, dx=0.5
б)х=|1,2;2,2;3,0;8,0;3,4|

Решение:
http://www.radikal.ru
http://www.radikal.ru
http://www.radikal.ru
http://www.radikal.ru

Верно ли я решила задачу?

Автор: Vahappaday 13.9.2010, 15:58

Перепутали местами FOR и DO))
Всё наоборот, в первом случае решено через DO, во втором через FOR)

Автор: Марина Игоревна 14.9.2010, 11:35

Ну, получается мне просто программки местами надо поменять?))

Автор: julia_lisha 14.9.2010, 12:18

FOR и DO это циклы)

Автор: Марина Игоревна 14.9.2010, 12:34

Значит просто поменять местами строки в программе, я тут запуталась, хотя действительно по невнимательности ошибку сделала

Автор: Марина Игоревна 14.9.2010, 12:56

Или я опять не права??

Автор: Vahappaday 14.9.2010, 12:59

А можно текстом программку?)) Блок-схемы ладно, а вот программки разглядывать не очень удобно)) Да и копировать вставить иногда хочется)

Автор: Марина Игоревна 14.9.2010, 13:52

Program zad_2_1;
USES PRINTER;
Var x, y: real;
Begin
x:=0;
for x<=5 do
begin
y:=x*x*x + 2sqr(sin(sqr(x+3)));
writeln ('x=', x:6:2, 'y=', y:6:2);
writeln (LST, 'x=', x:6:2, 'y=',y:6:2);
x:=x+0,5:
end;
End.




Program zad_2_2;
USES PRINTER;
Var x,y: real;
i: integer;
a: array [1..5] of real;
Begin
a[1]:=1.2;
a[2]:=2.2;
a[3]:=3.0;
a[4]:=8.0;
a[5]:=3.4;
while i:=1 to 5 do
begin
y:=a[i]*a[i]*a[i]+2*sqr(sin(sqr(a[i]+3)));
writeln ('a[',i,']=', a[i]:6:2, 'y=',y:6:2);
writeln (LST, 'y=', y:6:2);
end;
End.

Вот, попыталась исправить.

Автор: Vahappaday 14.9.2010, 15:44

Во-первых,

Код
x:=x+0,5:
- точку поправьте на запятую, двоеточие - на точку с запятой.
Во-вторых, конструкции вида
Код
for x<=5 do
и
Код
while i:=1 to 5 do
в Паскале недопустимы.

Код
while условие do

или
Код
for счётчик = ... to ... do

Кстати, сразу подумайте, как сделать в FOR нецелое увеличение счётчика. Готовых средств в паскале не нашёл, а раз вам обязательно нужно именно через FOR, то придётся увеличивать максимальное значение в 2 раза, а в итерации делить значение счётчика на два))

Автор: Julia 15.9.2010, 2:34

Цитата(Марина Игоревна @ 13.9.2010, 22:20) *

Добрый вечер. Еще одна задача. Не могли бы Вы ее проверить?
Задача:
Составить две программы вычисления и вывода на принтер значений аргумента и функции y=f(x). Первая программа вычисляет у для х, изменяющегосяв заданном интервале с указанным шагом х. Во второй программе значения аргумента задаются массивом. В первой программе цикл организовать с помощью условного оператора FOR, во второй - с использованием оператора цикла DO.
x^3+2sin^2*(x+3)^2
а)0(<=)x(<=)5, dx=0.5
б)х=|1,2;2,2;3,0;8,0;3,4|



Вы уверены, что задание записано правильно? Цикл с параметром FOR - это БЕЗусловный оператор. Логичней в этой задаче использовать условный оператор WHILE. Во второй задаче логичней воспользоваться циклом с параметром.

Автор: Марина Игоревна 15.9.2010, 10:18

Задание списано с методички, а верно ли его составили я уж не знаю( Хорошо, буду думать как правильно исправить

Автор: Марина Игоревна 29.9.2010, 14:59

Program zad_2_2;
USES PRINTER;
Var x,y: real;
i: integer;
a: array [1..5] of real;
Begin
a[1]:=1.2;
a[2]:=2.2;
a[3]:=3.0;
a[4]:=8.0;
a[5]:=3.4;
while i>=1 and <= 5 do
begin
y:=a[i]*a[i]*a[i]+2*sqr(sin(sqr(a[i]+3)));
writeln ('a[',i,']=', a[i]:6:2, 'y=',y:6:2);
writeln (LST, 'y=', y:6:2);
end;
End.

Program zad_2_1;
USES PRINTER;
Var x, y: real;
Begin
x:=0;
for x:=5 to 1 do
begin
y:=x*x*x + 2sqr(sin(sqr(x+3)));
writeln ('x=', x:6:2, 'y=', y:6:2);
writeln (LST, 'x=', x:6:2, 'y=',y:6:2);
x:=x+0,5:
end;
End.
А теперь правильно?

Автор: Julia 30.9.2010, 12:15

Program zad_2_2;
USES PRINTER;
Var x,y: real;
i: integer;
a: array [1..5] of real;
Begin
a[1]:=1.2;
a[2]:=2.2;
a[3]:=3.0;
a[4]:=8.0;
a[5]:=3.4;
while (i>=1) and (i<= 5) do
begin
y:=a[i]*a[i]*a[i]+2*sqr(sin(sqr(a[i]+3)));
writeln ('a[',i,']=', a[i]:6:2, 'y=',y:6:2);
writeln (LST, 'y=', y:6:2);
end;
End.

Вторая задача неверна, поскольку x - параметр цикл, он не может быть вещественным числом.

Автор: Марина Игоревна 30.9.2010, 13:38

Program zad_2_1;
USES PRINTER;
Var y: real;
x: integer;
Begin
x:=0;
for x:=5 to 0 do
begin
y:=x*x*x + 2sqr(sin(sqr(x+3)));
writeln ('x=', x:6:2, 'y=', y:6:2);
writeln (LST, 'x=', x:6:2, 'y=',y:6:2);
x:=x+0,5:
end;
End.

А если так исправить? посмотрела подобные примеры вроде бы так должно быть.

Автор: Julia 30.9.2010, 14:07

В 2_2 еще ошибка: i не меняется.
В 2_1 при первом же проходе цикла x станет 5,5 - не integer. Отделите параметр цикла от аргумента функции, используйте разные переменные.

Если в цикле с параметром первое значение больше второго, то вместо to используется downto.

Автор: Марина Игоревна 6.10.2010, 11:52


В 2_2 еще ошибка: i не меняется. - Я тут не совсем разберусь если честно.

Program zad_2_1;
USES PRINTER;
Var x,y: real;
i: integer;
Begin
x:=0;
for i:=5 to 10 do
begin
y:=x*x*x + 2sqr(sin(sqr(x+3)));
writeln ('x=', x:6:2, 'y=', y:6:2);
writeln (LST, 'x=', x:6:2, 'y=',y:6:2);
x:=i*0,5:
end;
End.
В паскале вроде работает, но не уверенна в правильности. Я уже совсем запуталась(

Автор: Vahappaday 6.10.2010, 12:08

В 2_1 есть ошибки. Вот верный код:

Код
for i:=0 to 10 do
begin
x:=i*0,5;
y:=x*x*x + 2*sqr(sin(sqr(x+3)));
writeln ('x=', x:6:2, 'y=', y:6:2);
writeln (LST, 'x=', x:6:2, 'y=',y:6:2);
end;


for i:=0 to 10 do - мы ведь пробегаем 10 значений, от 0*0.5 до 10*0.5

x:=i*0,5; - должно быть в начале цикла и с точкой с запятой после выражения.

y:=x*x*x + 2*sqr(sin(sqr(x+3))); - добавлен символ умножения.



Автор: Vahappaday 6.10.2010, 12:22

в 2_2 достаточно добавить в конец цикла, прямо перед end строчку
Inc(i);

Автор: Марина Игоревна 6.10.2010, 13:18

Спасибо Вам огромное!!! До меня теперь дошло немного. А про случай в задаче 2_2 надо будет поискать материал, очень Вам благодарна!))

Автор: Vahappaday 6.10.2010, 14:06

Пожалуйста))
Но вообще вот так делать - это что-то не то...
На мой взгляд ошибка закралась в само задание, потому что так делать не совсем правильно.
Перебирать элементы массива надо for'ом, а изменять величину до наступления значения - в цикле while.
Но... какое есть, такое и сделали)

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)