помогите с задачей

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

помогите с задачей

Сообщение xoma » 19.12.2012 19:03:08

то что я пытаюсь сделать,но исправляя одни ошибки получаются другие


var a,x,pi,Q:real

begin
a:=1.65;
pi:=3.14;
readln(x);
if (x < 1.4) then
begin
Q=('pi*sqr(x-7/sqr(x))')
end
else if (x = 1.4) then
begin
Q=('a*(x*x*x)+7*sqrt(x)')
end
else if (x > 1.4) then
begin
Q=('ln(x+7*sqrt(abs(x+a)))')
end;
readln;

end.

вот сам пример
Вложения
1.jpg
1.jpg (5.38 КБ) Просмотров: 19763
2.jpg
2.jpg (2.12 КБ) Просмотров: 19763
3.jpg
3.jpg (1.28 КБ) Просмотров: 19763
xoma
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.12.2012 18:41:10

Re: помогите с задачей

Сообщение Little_Roo » 19.12.2012 19:31:34

xoma писал(а):var a,x,pi,Q:real

Точка с запятой в конце строки иде??

pi - это НЕ переменная, а константа. Ее объявлять не надо - зарезервированное слово. :shock:
xoma писал(а):Q=('pi*sqr(x-7/sqr(x))')


Это полная бредятина - вместо = используйте оператор присваивания :=
А в кавычках указывается переменная строкового типа :mrgreen:

И откуда та-а-а-а-кие познания и заготовки якобы программ??? :(
8-й класс чукотской школы при церковно-приходской яранге? (без обид - давно ТАКОГО не видел, даже у себя в гимназии - ну учитель я, каюсь) :shock: :shock: :shock:
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: помогите с задачей

Сообщение bormant » 19.12.2012 20:25:41

В условии -- lg x -- это десятичный логарифм, по основанию 10.
В программе ln x -- это натуральный логарифм, по основанию e.

Переход от основания e к основанию 10: lg(x) это ln(x)/ln(10).
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: помогите с задачей

Сообщение xoma » 19.12.2012 20:45:36

Little_Roo писал(а):
xoma писал(а):var a,x,pi,Q:real

Точка с запятой в конце строки иде??

pi - это НЕ переменная, а константа. Ее объявлять не надо - зарезервированное слово. :shock:
xoma писал(а):Q=('pi*sqr(x-7/sqr(x))')


Это полная бредятина - вместо = используйте оператор присваивания :=
А в кавычках указывается переменная строкового типа :mrgreen:

И откуда та-а-а-а-кие познания и заготовки якобы программ??? :(
8-й класс чукотской школы при церковно-приходской яранге? (без обид - давно ТАКОГО не видел, даже у себя в гимназии - ну учитель я, каюсь) :shock: :shock: :shock:

вообще никогда не было информатики,щас поступила на вышку,пока время есть,препод на парах ничего не давал,так что полный ноль..
xoma
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.12.2012 18:41:10

Re: помогите с задачей

Сообщение stikriz » 19.12.2012 21:08:40

xoma писал(а):Q=('ln(x+7*sqrt(abs(x+a)))')

xoma писал(а):Q=('a*(x*x*x)+7*sqrt(x)')

xoma писал(а):Q=('pi*sqr(x-7/sqr(x))')

xoma писал(а):pi:=3.14;

Если Вам поставят пару, то это комплимент. Вообще, есть куда расти.
Присваивание := Сравнение = (это Вы правильно пишите)
Pi - не обязательно делать переменной, если не хотите снизить точность вычислений - пи и в африке пи, подключите math - это функция.
Например, вот это
Код: Выделить всё
Q=('pi*sqr(x-7/sqr(x))')
- это Вы присваиваете переменной Q строку с некой формулой...
Садитесь, два. Оценка будет справедлива и логична - программировать Вы не умеете на паскале.
Как исправить - очень просто - читать доку или/и книги, читать чужие программы, пытаться писать самой, пока не получиться.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: помогите с задачей

Сообщение bormant » 19.12.2012 21:29:40

Дарю:
Код: Выделить всё
const
  eps = 1E-7;
  a = 1.65;
  b = 1.4;
var
  x, q: real;
begin
  write('Введите x: '); readln(x);
  if abs(x - b) < eps then
    q := a * sqr(x) * x + 7 * sqrt(x)
  else if x < b then
    q := pi * sqr(x) - 7 / sqr(x)
  else
    q := ln(x + 7 * sqrt(abs(x + a))) / ln(10);
  writeln('Q = ', q);
end.
Последний раз редактировалось bormant 21.12.2012 12:30:46, всего редактировалось 3 раз(а).
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: помогите с задачей

Сообщение stikriz » 19.12.2012 22:38:26

Little_Roo писал(а):pi - это НЕ переменная, а константа.

Код: Выделить всё
function pi : ValReal;[internproc:fpc_in_pi_real];

Little_Roo писал(а):без обид - давно ТАКОГО не видел, даже у себя в гимназии - ну учитель я

Вот такие вы все учителя периода капитализма - троечники. А ученики - двоечники, что логично. Без обид, но учитель должен хоть посмотреть, что такое пи.
У меня учитель по информатике в школе был гений, а я отличник :-)
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: помогите с задачей

Сообщение Vapaamies » 20.12.2012 10:43:42

stikriz писал(а):
Код: Выделить всё
function pi : ValReal;[internproc:fpc_in_pi_real];

Внезапно. Даже я не знал. В Turbo Pascal вроде была константа. В старых учебниках по Turbo Pascal тоже везде говорится, что константа. Но если бы я был учителем, то посмотрел бы в справке. :)

Посмотрел заодно, как в моем Delphi 6. Оказалось, что в System ее нет, а в коде развертывается компилятором. Т. е. фактически это константа, но теперь развертываемая компилятором в зависимости от заданной точности выражения (как понимаю) -- Single, Double или Extended. Оказалось также, что даже есть команда сопроцессора FLDPI, которую Delphi не использует.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: помогите с задачей

Сообщение xoma » 20.12.2012 12:35:53

bormant писал(а):Дарю:
Код: Выделить всё
const
  eps = 1E-7;
  a = 1.65;
var
  x, q: real;
begin
  write('Введите x: '); readln(x);
  if (abs(x) > 1.4 - eps) and (abs(x) < 1.4 + eps) then
    q := pi * sqr(x) - 7 / sqr(x)
  else if x < 1.4 then
    q := a * sqr(x) * x + 7 * sqrt(x)
  else
    q := ln(x + 7 * sqrt(abs(x + a))) / ln(10);
  writeln('Q = ', q);
end.

благодарю))
xoma
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.12.2012 18:41:10

Re: помогите с задачей

Сообщение Little_Roo » 20.12.2012 19:33:01

stikriz писал(а):У меня учитель по информатике в школе был гений, а я отличник

Да я физик вообще-то :shock: И это Я гений, а ученики - двоечники :D :D :D И пришел я из социализма :(
Так что обид нет, сам потихоньку учусь... когда я учился, на матфаке были только Минск-32, Наири и ... у-у-у-у-у... ЕС-1020 (но это для гуру). А расчеты наши МНСы аж в Алма-Ату летали считать (там БЭСМ-6 стояла - и за ленинградские шоколадки можно было у ...по-нынешнему - админа... выпросить 72 часа машинного времени в сутки :o )
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: помогите с задачей

Сообщение stikriz » 20.12.2012 20:45:51

Little_Roo писал(а):ЕС-1020 (но это для гуру).

На этом нас и учили - 15 терминалов и машинный зал с самим компом, АЦПУ, жестким диском и кондиционером :-) Бейсик и Фортран. У Учителя фамилия Адушкин. Он говорил на первом уроке:
- Хочешь научить человека плохому и уничтожить в нем программиста - научи его Бейсику. Итак, первое занятие мы познакомимся с языком программирования Бейсик...
И еще так, интересно длинючим пальцем показывал, как число заходит в стек, из чего было ясно, что Форт ему родной - число в стек заходило снизу вверх :-) TEXX... Эх, Рандомайз юсеэр... Моя первая программа не учебная была в псевдографике "Повесить-ли Рому?", ну сразу после решения квадратного уравнения, конечно.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: помогите с задачей

Сообщение xoma » 21.12.2012 02:30:09

эту я написала,ток у меня вот как получилось:
Код: Выделить всё
program zad1_var4;
user crt;
const
a=1.65;
var
x, q: real;
begin
clrscr;
writeln ('    a= ',a:4:2);
write ('Vvedite x = ');readln(x);
if x < 1.4 then q:=pi*sqr(x)-7/sqr(x) else
   if (x = 1.4) and (x > 1.4) then q:=a*(exp(3*ln(a)))+7sqrt(x)
     else q:=ln(x+7*sqrt(abs(x+a)))/ln(10);
writeln ('Q= ',q:7:3);
writeln ('-----------');
readln;
end.


Добавлено спустя 22 минуты 35 секунд:
2 задача
Код: Выделить всё
program zad2_var3;
uses crt;
const
  a=1.1;
var
i: integer;
b, x, y: real;
begin
clrscr;
writeln('    a=',a:3:1);
  for i:= 1 to 11 do
begin
  b:= 1+a*x;
  y:= (sqr(ln(b)))/b;
write('pri x = ',x:7:3,'  y = ',y:7:3);
x:= x+0.5;
readln;
end;
end.



подскажите как сделать что бы начиналось не с x = 0,000 y = 0,000, а с x = 0,5
Вложения
задача 2.jpg
условие
задача 2.jpg (8.25 КБ) Просмотров: 19657
xoma
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.12.2012 18:41:10

Re: помогите с задачей

Сообщение bormant » 21.12.2012 07:37:45

xoma писал(а):эту я написала,ток у меня вот как получилось:
Получилось ли? Ведь оно 1) не скомпилируется, 2) если исправить ошибки синтаксиса, будет считать несколько иную функцию, проверьте калькулятором, 3) условие (x = 1.4) and (x > 1.4) ложно при любых значениях x, 4) возведение в целую степень n при помощи x^n = e^(n ln x) -- не ошибка, но из пушки по воробьям, кроме того, попробуйте ввести отрицательное значение x ;-).

По поводу сравнения действительных чисел на равенство, вот вам нехитрый тест для размышления (single, double, extended -- действительные типы одинарной, двойной и расширенной точности, real может быть одним из них или между single и double (в Borland/Turbo Pascal)):
Код: Выделить всё
var
  xr: real;
  xs: single;
  xd: double;
  xe: extended;
begin
  xr := 1.4; xs := 1.4; xd := 1.4; xe := 1.4;
  if 1.4 = 1.4 then writeln('1.4 = 1.4') else writeln('1.4 <> 1.4');
  if xr = 1.4 then writeln('r1.4 = 1.4') else writeln('r1.4 <> 1.4');
  if xs = 1.4 then writeln('s1.4 = 1.4') else writeln('s1.4 <> 1.4');
  if xd = 1.4 then writeln('d1.4 = 1.4') else writeln('d1.4 <> 1.4');
  if xe = 1.4 then writeln('e1.4 = 1.4') else writeln('e1.4 <> 1.4');
end.
и тестовый прогон:
Код: Выделить всё
1.4 = 1.4
r1.4 <> 1.4
s1.4 <> 1.4
d1.4 <> 1.4
e1.4 = 1.4
Как видите, 1.4 очень часто не равно 1.4 ;-) Поэтому проверка на равенство превращается в if abs(x - 1.4) < eps then.
Пойду вверху тоже поправлю на короткий вариант... И да, в первоначальном варианте была ошибка, имелось в виду, как вы уже конечно догадались, if (x > 1.4 - eps) and (x < 1.4 + eps) then, или, как пишут математики, 1.4 - eps < x < 1.4 + eps.

Добавлено спустя 5 минут 40 секунд:
xoma писал(а):чтобы начиналось ... с x = 0,5
До цикла задайте желаемое начальное значение для x.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: помогите с задачей

Сообщение xoma » 21.12.2012 10:42:44

bormant писал(а):
xoma писал(а):эту я написала,ток у меня вот как получилось:
Получилось ли? Ведь оно 1) не скомпилируется, 2) если исправить ошибки синтаксиса, будет считать несколько иную функцию, проверьте калькулятором, 3) условие (x = 1.4) and (x > 1.4) ложно при любых значениях x, 4) возведение в целую степень n при помощи x^n = e^(n ln x) -- не ошибка, но из пушки по воробьям, кроме того, попробуйте ввести отрицательное значение x ;-).

По поводу сравнения действительных чисел на равенство, вот вам нехитрый тест для размышления (single, double, extended -- действительные типы одинарной, двойной и расширенной точности, real может быть одним из них или между single и double (в Borland/Turbo Pascal)):
Код: Выделить всё
var
  xr: real;
  xs: single;
  xd: double;
  xe: extended;
begin
  xr := 1.4; xs := 1.4; xd := 1.4; xe := 1.4;
  if 1.4 = 1.4 then writeln('1.4 = 1.4') else writeln('1.4 <> 1.4');
  if xr = 1.4 then writeln('r1.4 = 1.4') else writeln('r1.4 <> 1.4');
  if xs = 1.4 then writeln('s1.4 = 1.4') else writeln('s1.4 <> 1.4');
  if xd = 1.4 then writeln('d1.4 = 1.4') else writeln('d1.4 <> 1.4');
  if xe = 1.4 then writeln('e1.4 = 1.4') else writeln('e1.4 <> 1.4');
end.
и тестовый прогон:
Код: Выделить всё
1.4 = 1.4
r1.4 <> 1.4
s1.4 <> 1.4
d1.4 <> 1.4
e1.4 = 1.4
Как видите, 1.4 очень часто не равно 1.4 ;-) Поэтому проверка на равенство превращается в if abs(x - 1.4) < eps then.
Пойду вверху тоже поправлю на короткий вариант... И да, в первоначальном варианте была ошибка, имелось в виду, как вы уже конечно догадались, if (x > 1.4 - eps) and (x < 1.4 + eps) then, или, как пишут математики, 1.4 - eps < x < 1.4 + eps.

Добавлено спустя 5 минут 40 секунд:
xoma писал(а):чтобы начиналось ... с x = 0,5
До цикла задайте желаемое начальное значение для x.

вот обе они у меня идут без ошибок
1- сделала по примеру препода(по циклу if которая),наконец то отрыла в методичках, а ваш "eps",простите, не понимаю(( ну нет у меня знаний по информатике((
2 - если с 0,5 начинать, i - в нецелочисленные записывать, ошибку выдает 97 на записи for i:= 0.5 to 11 do

Добавлено спустя 8 минут:
ой))со второй разобралась))
с просони сначала не дошло
xoma
незнакомец
 
Сообщения: 9
Зарегистрирован: 19.12.2012 18:41:10

Re: помогите с задачей

Сообщение bormant » 21.12.2012 12:48:47

xoma писал(а):обе они у меня идут без ошибок

Верю, возможно просто на форум скопировали неправильно, ибо если скопировать ваш вариант и попробовать скомпилировать, получим:
Код: Выделить всё
Compiling task.pas
task.pas(2,5) Fatal: Syntax error, "BEGIN" expected but "identifier USER" found
Fatal: Compilation aborted
Но даже после исправления всех синтаксических ошибок, логические останутся на месте.
Ваши результаты: Q(1.4) = 2.586, Q(-2) = 10.816, Q(2) = 1.187
Берём куркулятор, считаем Q(1.4) = 1.65 * 1.4^3 + 7 * √1.4 = 4.5276 + 8.2825 = 12.810.
Не сходится, однако. Согласны?
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru