Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 22.12.2009, 15:42   #1 (permalink)
HD-boy
Новичок
 
Регистрация: 22.11.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Pascal. Функции.

Здравствуйте. Помогите пожалуйста с задачей на Паскале.

Используя пошаговую детализацию, спроектировать схему алгоритма вычисления сложной функции, при заданных значениях a,b,x.

Задание.
Составить алгоритм табулирования функции y=f(a,b,x) из предыдущего задания, если параметр х изменяется от -0,5 до 2,5 с шагом 0,5, параметр а изменяется от 0,1 с постоянным шагом 0,2 до 1,9, а переменная b=sqrt((1+a)/(1+x)) (Корень квадратный из числа (1+a)/(1+x)
См. Фото, b - это тоже переменная..

Вот есть свои наработки, но проблема с выводом ответа: должно выводиться некое подобие таблицы, где описаны изменения х,а,у.

Код:

var x,a,b,hx,x0,ha,y,ao,xn,an:real;
begin
clrscr;
writeln('vvedite x0 '); readln(x0);
writeln('vvedite a0 '); readln(ao);
Writeln('vvedite ha'); readln(ha);
writeln('vvedite hx'); readln(hx);
writeln('vvedite xn '); readln(xn);
writeln('vvedite an '); readln(an);
writeln('vvedite B '); readln(b);
clrscr;
a:=ao;
writeln(''); writeln('');writeln('');writeln('') ;writeln('');writeln('');
writeln(''); writeln('');writeln('');writeln('') ;writeln('');writeln('');
writeln(''); writeln('');writeln('');
write(' x ||');
write(' a ||');
writeln(' y ||'); a:=ao;
repeat begin
x:=x0;
repeat begin
if x<0 then y:=(sqr(a)+sqr(b)*x)/sqrt(1+a) else y:=sqr(sqr(a)+sqr(b));
if x>0 then begin
if x<1 then y:=ln(x)/(sqr(x)+sqr(b)) else y:=sqrt(x*(sqr(a)+sqr(b)));
write(x:4:2,'||');
write(a:4:2,'||');
write(y:3:2,'||');
writeln('');
x:=x+hx;
end;
end;
until x>xn;
{x:=x+hx;} a:=a+ha;
end;
until a>an;
writeln('===================');
repeat until keypressed;
end.
Миниатюры
dsc00187-eiiey.jpg  
HD-boy вне форума   Ответить с цитированием

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

Ваша тема очень схожа по содержанию с данными топиками

Функции на Паскале
Процедуры, функции

Старый 22.12.2009, 22:10   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,853
Сказал(а) спасибо: 317
Поблагодарили 542 раз(а) в 183 сообщениях
Репутация: 101510
По умолчанию

Это очень хорошо, что Вы сами пытаетесь написать программу. Желаю удачи. Несколько поправок, замечаний и рекомендаций.

1. Коль скоро Вы используете команды ClrScr и KeyPressed, Вы должны в начале создать указание присоединить модуль CRT. Без этого машина Вас не поймет. Т.е. самой первой должна идти строка
Uses CRT;

2. Функцию f(x,a) желательно оформить именно в виде функции, т.е. написать, например, так:
Function F(x,a:REAL):REAL;
VAR b:REAL;
BEGIN
b:=sqrt((1+a)/(1+x));
If x<0 then
F:=(sqr(a)+sqr(b))*x/sqrt(abs(1+a)) else
If x=0 then
F:=sqr(sqr(a)+sqr(b)) else
If (x>0) and (x<1) then
F:=ln(y)/(sqr(a)+sqr(b)) else
F:=sqrt(x*(sqr(a)+sqr(b));
END;
Теперь в теле программы, где нужно, достаточно написать y:=F(x,a);

3. Думаю, что исходные данные лучше ввести сразу явно, чем заморачиваться каждый раз с вводом с клавиатуры. Почему бы вместо всех этих 'Vvedite' не написать просто:
x0:=-0.5;
xn:=2.5;
и т.д. А b и вовсе вводить не надо, его программа должна сама вычислять.

4. Если Вы хотите сделать на экране отступ в несколько строк, то совсем не нужно повторять многократно writeln(''); Лучше организуйте цикл. Например, чтобы отступить на 15 строк, достаточно написать:
for i:=1 to 15 do writeln;
Пустой параметр ('') указывать не обязательно.

5. Оператор repeat ... until (в отличие от while ... do) не требует внутри себя общих операторных скобок begin ... end. Всё, что находится между repeat и until, составляет тело цикла.

6. Попробуйте для начала обойтись без псевдографики - просто добейтесь того, чтобы выводимые на экран числа выстроились в ряды и колонки. Псевдографику потом добавить можно.

Успехов!
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 24.12.2009, 17:48   #3 (permalink)
HD-boy
Новичок
 
Регистрация: 22.11.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо за советы) Но решил подумать, и вот другой вариант:

Код:

program zadacha;
uses crt;
var x1,x2,h,a1,a2,h2,b,i,k,y:real;
begin
clrscr;
write('vvedite x1 ');readln(x1);
write('vvedite x2 ');readln(x2);
write('vvedite shag ');readln(h);
write('vvedite a1 ');readln(a1);
write('vvedite a2 ');readln(a2);
write('vvedite h2 ');readln(h2);
writeln;
i:=x1;{k:=a1;}
writeln(' x y a b ');
while i<x2 do begin k:=a1;
while k<a2 do begin
b:=sqrt(abs((1+k)/(1+i)));
if i<0 then y:=((k*k+b*b)*i/sqrt(abs(1+k)));
if i=0 then y:=sqr(k*k+b*b);
if (0<i) and (i<1) then y:=(ln(i)/(k*k+b*b));
if (i=1) or (i>1) then y:=sqrt(i*(k*k+b*b));
writeln(' ',i:3:1,' ',y:3:1,' ',k:3:1,' ',b:3:1,' ');
k:=k+h2;end;
i:=i+h;end;
readkey;
end.
HD-boy вне форума   Ответить с цитированием
Ads

Яндекс

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

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

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

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




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

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