• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Pascal. Функции.

  • Автор темы Автор темы HD-boy
  • Дата начала Дата начала

HD-boy

Ученик
Регистрация
22 Ноя 2009
Сообщения
10
Реакции
0
Баллы
0
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 - копия.webp
    DSC00187 - копия.webp
    24.2 KB · Просмотры: 76
Это очень хорошо, что Вы сами пытаетесь написать программу. Желаю удачи. Несколько поправок, замечаний и рекомендаций.

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.
 
Назад
Сверху