Помощь - Поиск - Пользователи - Календарь
Полная версия: Программирование в Турбо Паскале > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
Марина Игоревна
Добрый день. Необходимо составить программу для вычисления и вывода вычисленного значения на принтер и экран дисплея в виде: Функция равна <числовое значение>.

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.

Проверьте, пожалуйста, верно ли я составила программу, точнее алгоритм?
граф Монте-Кристо
По алгоритму - последние три иф'а немного не понятны. Зачем они вообще? Не проще просто подставить у и х в заданную функцию?
По реализации - много ошибок. printer - для вывода на принтер? Если так, то Вы это нигде не используете. Потом, вводите а и b, а считываете зачем-то в одну переменную, да ещё и в у. В общем, ещё разбираться и разбираться.
Марина Игоревна
Добрый вечер. Разбиралась с паскалем. Вот что получилось:
Изображение
Изображение
Еще необходимо по усмотрению выбрать числовые значения , ввести их с клавиатуры и определить какая ветвь вычислений "проработает" при введенных значениях. Это просто можно будет записать числа и указать какая ветвь сработает?
Vahappaday
угу)) теперь как-то так)) Хотя и if'ы немного необычно расположены, но всё будет работать))

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

Программку проверяли сами, работает?
Марина Игоревна
Да, проверяла) Работает, просто оценка со стороны знающих людей мне не помешает, тем более что университет за 400 км от меня, к педагогу точно не скоро попаду. Спасибо Вам smile.gif
Марина Игоревна
Добрый вечер. Еще одна задача. Не могли бы Вы ее проверить?
Задача:
Составить две программы вычисления и вывода на принтер значений аргумента и функции 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
Перепутали местами FOR и DO))
Всё наоборот, в первом случае решено через DO, во втором через FOR)
Марина Игоревна
Ну, получается мне просто программки местами надо поменять?))
julia_lisha
FOR и DO это циклы)
Марина Игоревна
Значит просто поменять местами строки в программе, я тут запуталась, хотя действительно по невнимательности ошибку сделала
Марина Игоревна
Или я опять не права??
Vahappaday
А можно текстом программку?)) Блок-схемы ладно, а вот программки разглядывать не очень удобно)) Да и копировать вставить иногда хочется)
Марина Игоревна
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
Во-первых,
Код
x:=x+0,5:
- точку поправьте на запятую, двоеточие - на точку с запятой.
Во-вторых, конструкции вида
Код
for x<=5 do
и
Код
while i:=1 to 5 do
в Паскале недопустимы.

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

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

Кстати, сразу подумайте, как сделать в FOR нецелое увеличение счётчика. Готовых средств в паскале не нашёл, а раз вам обязательно нужно именно через FOR, то придётся увеличивать максимальное значение в 2 раза, а в итерации делить значение счётчика на два))
Julia
Цитата(Марина Игоревна @ 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. Во второй задаче логичней воспользоваться циклом с параметром.
Марина Игоревна
Задание списано с методички, а верно ли его составили я уж не знаю( Хорошо, буду думать как правильно исправить
Марина Игоревна
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
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 - параметр цикл, он не может быть вещественным числом.
Марина Игоревна
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
В 2_2 еще ошибка: i не меняется.
В 2_1 при первом же проходе цикла x станет 5,5 - не integer. Отделите параметр цикла от аргумента функции, используйте разные переменные.

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

В 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
В 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
в 2_2 достаточно добавить в конец цикла, прямо перед end строчку
Inc(i);
Марина Игоревна
Спасибо Вам огромное!!! До меня теперь дошло немного. А про случай в задаче 2_2 надо будет поискать материал, очень Вам благодарна!))
Vahappaday
Пожалуйста))
Но вообще вот так делать - это что-то не то...
На мой взгляд ошибка закралась в само задание, потому что так делать не совсем правильно.
Перебирать элементы массива надо for'ом, а изменять величину до наступления значения - в цикле while.
Но... какое есть, такое и сделали)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.