Pascal. Функции.
Вложений: 1
Здравствуйте. Помогите пожалуйста с задачей на Паскале.
Используя пошаговую детализацию, спроектировать схему алгоритма вычисления сложной функции, при заданных значениях 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. |
Это очень хорошо, что Вы сами пытаетесь написать программу. Желаю удачи. Несколько поправок, замечаний и рекомендаций.
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. Попробуйте для начала обойтись без псевдографики - просто добейтесь того, чтобы выводимые на экран числа выстроились в ряды и колонки. Псевдографику потом добавить можно. Успехов! |
Спасибо за советы) Но решил подумать, и вот другой вариант:
Код: 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. |
Часовой пояс GMT +4, время: 07:33. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.