Марина Игоревна
Сообщение
#61140 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.
Проверьте, пожалуйста, верно ли я составила программу, точнее алгоритм?
граф Монте-Кристо
Сообщение
#61142 18.7.2010, 8:02
По алгоритму - последние три иф'а немного не понятны. Зачем они вообще? Не проще просто подставить у и х в заданную функцию?
По реализации - много ошибок. printer - для вывода на принтер? Если так, то Вы это нигде не используете. Потом, вводите а и b, а считываете зачем-то в одну переменную, да ещё и в у. В общем, ещё разбираться и разбираться.
Марина Игоревна
Сообщение
#61617 11.9.2010, 13:56
Добрый вечер. Разбиралась с паскалем. Вот что получилось:


Еще необходимо по усмотрению выбрать числовые значения , ввести их с клавиатуры и определить какая ветвь вычислений "проработает" при введенных значениях. Это просто можно будет записать числа и указать какая ветвь сработает?
Vahappaday
Сообщение
#61632 11.9.2010, 16:21
угу)) теперь как-то так)) Хотя и if'ы немного необычно расположены, но всё будет работать))
Как проверять - зависит от преподавателя.... Как на мой вкус, Вашей проверки вполне достаточно...
Программку проверяли сами, работает?
Марина Игоревна
Сообщение
#61637 12.9.2010, 2:22
Да, проверяла) Работает, просто оценка со стороны знающих людей мне не помешает, тем более что университет за 400 км от меня, к педагогу точно не скоро попаду. Спасибо Вам
Марина Игоревна
Сообщение
#61659 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|
Решение:




Верно ли я решила задачу?
Vahappaday
Сообщение
#61660 13.9.2010, 15:58
Перепутали местами FOR и DO))
Всё наоборот, в первом случае решено через DO, во втором через FOR)
Марина Игоревна
Сообщение
#61668 14.9.2010, 11:35
Ну, получается мне просто программки местами надо поменять?))
julia_lisha
Сообщение
#61671 14.9.2010, 12:18
FOR и DO это циклы)
Марина Игоревна
Сообщение
#61672 14.9.2010, 12:34
Значит просто поменять местами строки в программе, я тут запуталась, хотя действительно по невнимательности ошибку сделала
Марина Игоревна
Сообщение
#61674 14.9.2010, 12:56
Или я опять не права??
Vahappaday
Сообщение
#61675 14.9.2010, 12:59
А можно текстом программку?)) Блок-схемы ладно, а вот программки разглядывать не очень удобно)) Да и копировать вставить иногда хочется)
Марина Игоревна
Сообщение
#61676 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
Сообщение
#61680 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
Сообщение
#61689 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. Во второй задаче логичней воспользоваться циклом с параметром.
Марина Игоревна
Сообщение
#61694 15.9.2010, 10:18
Задание списано с методички, а верно ли его составили я уж не знаю( Хорошо, буду думать как правильно исправить
Марина Игоревна
Сообщение
#62020 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
Сообщение
#62042 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 - параметр цикл, он не может быть вещественным числом.
Марина Игоревна
Сообщение
#62048 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
Сообщение
#62056 30.9.2010, 14:07
В 2_2 еще ошибка: i не меняется.
В 2_1 при первом же проходе цикла x станет 5,5 - не integer. Отделите параметр цикла от аргумента функции, используйте разные переменные.
Если в цикле с параметром первое значение больше второго, то вместо to используется downto.
Марина Игоревна
Сообщение
#62366 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
Сообщение
#62367 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
Сообщение
#62368 6.10.2010, 12:22
в 2_2 достаточно добавить в конец цикла, прямо перед end строчку
Inc(i);
Марина Игоревна
Сообщение
#62372 6.10.2010, 13:18
Спасибо Вам огромное!!! До меня теперь дошло немного. А про случай в задаче 2_2 надо будет поискать материал, очень Вам благодарна!))
Vahappaday
Сообщение
#62373 6.10.2010, 14:06
Пожалуйста))
Но вообще вот так делать - это что-то не то...
На мой взгляд ошибка закралась в само задание, потому что так делать не совсем правильно.
Перебирать элементы массива надо for'ом, а изменять величину до наступления значения - в цикле while.
Но... какое есть, такое и сделали)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.