Помощь - Поиск - Пользователи - Календарь
Полная версия: Выполнение программы простой структуры
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
cruising
Помогите пожалуйста разобраться, задание на рисунке, вот что у меня получилось
Var x,x1,y,y1,y2:real;T:Boolean;
Begin
Writeln('введите число для вычисления выражения1');
Read(x);
Writeln('Результат задания а');
If x>0 then writeln('')else
Begin
y:=exp(1/3*ln(x-x*x))+exp(5*ln(x));
Writeln ('при х=',x:6:3,' y=',y:6:3);
y1:=abs(y);
Writeln('Абсолютное значение y1=', y1:6:3);
y2:=sqr(y);
Writeln('Квадрат у=',y2:6:3);
End;
Writeln('Введите координаты точки');
Readln(x1,y1);
T:=(sqr(x1)+sqr(y1)<=1);
Writeln('Результат задания б:',t);
End.


Что мне нужно написать в строке if?Нажмите для просмотра прикрепленного файла


М
Тэги!!
Правила Форума, п.5, и правила раздела задачи, п.2.
Lapp

Lapp
Цитата(cruising @ 11.04.2010 23:28) *
If x>0 then writeln('')else

...
Что мне нужно написать в строке if?
А зачем там что-то писать? Она вообще не нужна. Я не знаю, что у вас там подразумевается под "системой тестов", но твое данное выражение вычислимо всегда, поэтому никаких ограничений на x вообще не нужно. Можешь вывести фразу типа: "выражение ... определено при любом значении аргумента x".


Добавлено через 3 мин.
Или, может, имются в виду вычислительные возможности компьютера?.. Тогда нужно проводить анализ, когда отдельные составляющие выражения испытывают переполнение или потерю значимости. Если действительно это нужно - скажи, подумаем, как это сделать.
TarasBer
> Или, может, имются в виду вычислительные возможности компьютера?..

Вы имели в виду ограничения стандартных вещественных типов? А то возможности компьютера по умножению чисел - они значительно превосходят то, что может понадобиться обычному пользователю.

> y:=exp(1/3*ln(x-x*x))+exp(5*ln(x));

Такой записью вы себя ограничиваете. Возводить в целую степень и извлекать нечётные корни можно и из отрицательных чисел. И из нуля.
cruising
Если я убираю строку с оператором if, запускаю программу, вставляю числло, у меня выдает: ошибка! вещественное деление на 0. А когда в формуле y:=exp(1/3*ln(x-x*x))+exp(5*ln(x)) меняю минус на плюс y:=exp(1/3*ln(x+x*x))+exp(5*ln(x)), всё считает верно, а с минусом ни как не хочет работать.
TarasBer
Для извлечения кубического корня надо разбирать два случая (больше нуля или меньше). Даже три.


function Root3(e: extended): extended;
begin
if e = 0 then Root3 := 0
else if e > 0 then Root3 := exp(1/3 * ln(e))
else Root3 := -exp(1/3 * ln(-e));
end;

cruising
Цитата(TarasBer @ 12.04.2010 15:50) *

Для извлечения кубического корня надо разбирать два случая (больше нуля или меньше). Даже три.


function Root3(e: extended): extended;
begin
if e = 0 then Root3 := 0
else if e > 0 then Root3 := exp(1/3 * ln(e))
else Root3 := -exp(1/3 * ln(-e));
end;



После function выдаёт ошибка! ожидался оператор
Ozzя
Цитата
После function выдаёт ошибка! ожидался оператор

Наверняка ошибка до, а не после. Проверь, стоит ли ; после оператора, стоящего перед function
TarasBer
Мой код надо вставить перед первым begin.
cruising
Цитата(TarasBer @ 12.04.2010 16:03) *

Мой код надо вставить перед первым begin.

вот что получилось, но сейчас выдает ошибка: неизвестное имя типа extended
Var x,x1,y,y1,y2:real;T:Boolean;
function Root3(e: extended): extended;
begin
if e = 0 then Root3 := 0
else if e > 0 then Root3 := exp(1/3 * ln(e))
else Root3 := -exp(1/3 * ln(-e));
end;
Begin
Writeln('введите число для вычисления выражения1');
Read(x);
Writeln('Результат задания а');
Begin
y:=exp(1/3*ln(x-x*x))+exp(5*ln(x));
Writeln ('при х=',x:6:3,' y=',y:6:3);
y1:=abs(y);
Writeln('Абсолютное значение y1=', y1:6:3);
y2:=sqr(y);
Writeln('Квадрат у=',y2:6:3);
End;
Writeln('Введите координаты точки');
Readln(x1,y1);
T:=(sqr(x1)+sqr(y1)<=1);
Writeln('Результат задания б:',t);
End.


М
Я не понимаю - сколько раз нужно повторить? Тэги!!
В след. раз закрою тему.
Lapp

TarasBer
1. Вы эту функцию вставили в код, но никак не используете.
2. В Турбо Паскале по умолчанию пользоваться типом extended нельзя. Options->Compiler, там ищете галочку у надписи что-то вроде "8087", справа снизу окна где-то, ставите туда галочку, убираете галочку с "Emulation", как-то так.
cruising
Цитата(TarasBer @ 12.04.2010 17:02) *

1. Вы эту функцию вставили в код, но никак не используете.
2. В Турбо Паскале по умолчанию пользоваться типом extended нельзя. Options->Compiler, там ищете галочку у надписи что-то вроде "8087", справа снизу окна где-то, ставите туда галочку, убираете галочку с "Emulation", как-то так.

да я не в турбопаскале делаю, а в pascal abc, может в этом ещё причина
Ozzя
Цитата
да я не в турбопаскале делаю, а в pascal abc, может в этом ещё причина

Да.
Неужели трудно догадаться extended поменять на real?
cruising
Цитата(Ozzя @ 12.04.2010 17:55) *

Да.
Неужели трудно догадаться extended поменять на real?

Да я не волоку вообще в этом, я заочник, разбираться надо долго с этим, времени нет!
Поменял extended на real, всё равно ошибка: вещественное деление на 0, что ещё может быть?

Добавлено через 2 мин.
Главное когда под корнем минус меняю на плюс, всё прекрасно работает, а с минусом ошибка и всё тут
TarasBer
> Да я не волоку вообще в этом, я заочник, разбираться надо долго с этим, времени нет!

Плохо.

> Главное когда под корнем минус меняю на плюс, всё прекрасно работает, а с минусом ошибка и всё тут

Да потому что ты тупо добавил в код новую функцию, но ваще её не используешь, ты считаешь по-старому (y:=exp(1/3*ln(x-x*x))+exp(5*ln(x));). Программа по-прежнему пытается делать то, что тут написано, то есть взять логарифм от отрицательного числа (ты, надеюсь, в курсе, что у отрицательного числа нельзя взять вещественный логарифм?).

Как использовать функцию - вообще интуитивно очевидно должно быть, но раз ты не "волочешь" и не хочешь разбираться, то толку тебе помогать.
cruising
TarasBer, ну да так то, руки дойдут, разбирусь как-нибудь, спасибо зо то что, хотя бы попытался мне помочь.
Гость
program khorolets8;
var
ah: array[1..10,1..10] of real;
i,j,m,n,s: integer;
begin
writeln('Vod m,n'); readln(m,n); writeln('Vod matrix');
for i:=1 to m do
for j:=1 to n do read(ah[i,j]);
s:=0;
for i:=1 to m do
for j:=1 to n do
IF (ah[i,j]>0)and(ah[i,j]<ah[j-1])
then s:=s+ah[i,j];
writeln(' ':4,'s=',s:3);
end.


выбивает 26ой error, ошибка в строчке с if... в паскале я мало грамотен, помогите, а?
volvo
Ah - двумерный массив, значит для обращения к нему требуется 2 индекса. В той строчке везде по два, как положено, но последнее обращение - с одним индексом. Куда второй потерялся?
Гость
В блок схеме я писал в том месте ...Аh[1,n-1]
Tau
Цитата(TarasBer @ 12.04.2010 15:50) *

Для извлечения кубического корня надо разбирать два случая (больше нуля или меньше). Даже три.


function Root3(e: extended): extended;
begin
if e = 0 then Root3 := 0
else if e > 0 then Root3 := exp(1/3 * ln(e))
else Root3 := -exp(1/3 * ln(-e));
end;




По правилам структурирования программ, функция должна иметь один выход, а у вас 3. nea.gif
volvo
Цитата
функция должна иметь один выход, а у вас 3
Научитесь сначала читать код, потом возьметесь за критику. Где 3 выхода? Я вижу только один выход из подпрограммы. Перед последним End-ом. Все остальное - не более чем запоминание результата, который функция может вернуть (а может и НЕ вернуть, как повезет).

Кстати, ссылку на "правила структурирования программ" можно получить? (с указанием автора, желательно - не Васи Пупкина)... И заодно объяснение, чем подобная функция нарушает правила структурирования... Иначе - все, что я вижу в этом посте - это поднятие старой темы, причем необоснованное. Если ответа не последует в течении 12 часов - пост №18 будет просто удален. Как и все последующие.
Гость
Цитата(volvo @ 30.05.2010 15:34) *

Научитесь сначала читать код, потом возьметесь за критику. Где 3 выхода? Я вижу только один выход из подпрограммы. Перед последним End-ом. Все остальное - не более чем запоминание результата, который функция может вернуть (а может и НЕ вернуть, как повезет).

Кстати, ссылку на "правила структурирования программ" можно получить? (с указанием автора, желательно - не Васи Пупкина)... И заодно объяснение, чем подобная функция нарушает правила структурирования... Иначе - все, что я вижу в этом посте - это поднятие старой темы, причем необоснованное. Если ответа не последует в течении 12 часов - пост №18 будет просто удален. Как и все последующие.


1.Выход из функции все должен находится перед закрывающем операндом.(Примеры: MFC)
2.Любую книгу возьми про стили программирования.
3.Поэтому желательно писать так (если вам конечно не жалко памяти, если жалко памяти пишите на asm'е):

function Root3(e: extended): extended;
integer tmp;
begin
if (e = 0) then
tmp := 0;
else if (e > 0) then
tmp := exp(1/3 * ln(e));
else
tmp := -exp(1/3 * ln(-e));

Root3 := tmp;
end;

Lapp
Цитата(Гость @ 30.05.2010 17:13) *

1.Выход из функции все должен находится перед закрывающем операндом.(Примеры: MFC)
2.Любую книгу возьми про стили программирования.
3.Поэтому желательно писать так (если вам конечно не жалко памяти, если жалко памяти пишите на asm'е):

function Root3(e: extended): extended;
integer tmp;
begin
if (e = 0) then
tmp := 0;
else if (e > 0) then
tmp := exp(1/3 * ln(e));
else
tmp := -exp(1/3 * ln(-e));

Root3 := tmp;
end;



lol.gif Улет, просто улет!! lol.gif
volvo, спасибо, что оставил мне удовольствие ответить этому олуху.. )) На этот раз, в соответствии с тоном, взятым Гостем, отброшу весь этикет.

Гость, ты бы потрудился сначала узнать необходимый минимум по предмету перед тем, как дискутировать с профессионалами, а? Или уж по САМОМУ минимуму - приводил бы корректный (компилирующийся) код..
"Три выхода"! три кварка! три карты.. три апельсина! )) смех, да и только..

Совет тебе: урой своего учителя. Ну, или хотя бы не прогуливай занатия..

кэшмарт.. три выхода.. "желательно писать так".. "если вам конечно не жалко памяти".. держите меня трое.. нет, лучше семеро ))..

Гость, не обессудь, линк на твое сообщение отправляется в раздел "Юмор", в тему "Смешные случаи на форуме" или что-то в этом роде smile.gif.
TarasBer
Да тут уже на форуме говорили, что при изучении Паскаля детям принудительно не дают в середине кода присваивать значение результату функции, чтобы им легче было переходить на другие языки, где такого нету. (Может это и правильно, чтобы детей лучше обточить под потребности индустрии...) Вот и рождаются такие перлы, да и отступы какие-то больно большие, не паскальные, да и способ объявления переменной.

Добавлено через 1 мин.
Кстати, а зачем условие в блоке if заключать в скобчки?
SKVOZNJAK
Цитата
1.Выход из функции все должен находится перед закрывающем операндом.

Зря смеётесь, примерно так часто и делается, просто по общепринятым правилам некоторых сообществ нельзя говорить о том что реально применяется на практике. По ходу человек готовится писать на чистом Си, без ООП, а там как раз в сложных ситуациях применяется или бреак или гото. Причём код с бреак читается намного хуже чем с гото. Подставьте в пример кода гото и он заработает на все сто, за исключением ошибок в синтаксисе. Достаточно посмотреть примеры опенсорсных сишных программ чтобы уяснить какие методы можно применять в реальных программах а какие в показательных учебных.
volvo
Цитата
По ходу человек готовится писать на чистом Си, без ООП
Тогда пусть этот челвек отвечает в разделе "Другие языки", а не лезет в Паскаль, коли не знает того, что Паскаль позволяет использовать имя функции (как LValue) для промежуточного хранения результата функции (либо до ее окончания, либо до Exit-а)

Цитата
Причём код с бреак читается намного хуже чем с гото.
За код с goto у нас не задумываясь, и не смотря на любые прежние заслуги, увольняют без выходного пособия. Точка.

Цитата
Достаточно посмотреть примеры опенсорсных сишных программ чтобы уяснить какие методы можно применять в реальных программах а какие в показательных учебных.
Опенсорс - это "я так делаю, потому что моя левая пятка так захотела, или мне так проще, и плевать на мнение остальных". Не далее, как сегодня я уже видел подобный хит: Кнопки WinAPI (а потом опять будут разговоры, что программа не работает, и опять во всем будут винить ОС).

Опенсорс - помойка, и очень часто - пример того, как писать НЕ надо...

"Теперь по Борщову" (С)
Цитата
1.Выход из функции все должен находится перед закрывающем операндом.(Примеры: MFC)
2.Любую книгу возьми про стили программирования.
3.Поэтому желательно писать так (если вам конечно не жалко памяти, если жалко памяти пишите на asm'е):
  1. MFC - это не Паскаль, посему примером для меня быть не может в данном случае. Язык не тот. О разнице между return и <имя_функции> := я уже написал выше. Си нервно курит в стороне в данном случае...
  2. Я же просил ссылку, а не абстрактного "Васю Пупкина", даже если его зовут Herb Sutter. Я все еще жду...
  3. Мне как раз памяти жалко, вот я временную переменную не описал, в отличие от... Не нужно это. А на чем писать - это я как-нибудь сам разберусь, без посторонней помощи.
TarasBer
> За код с goto у нас не задумываясь, и не смотря на любые прежние заслуги, увольняют без выходного пособия. Точка.

Это тоже фанатизм какой-то.
Что, считается лучше так?

repeat
...
if oops1 then break;
...
if oops2 then break;
...
break;
until false;


Или так?

try
...
if oops1 then raise e;
...
if oops2 then raise e;
...
except
on e: MyCoolException do begin
end;


Или так?

procedure MyCoolProc;
begin
...
if oops1 then Exit;
...
if oops2 then Exit;
...
end;

...
MyCoolProc


Чем это лучше гото? Гото Папа Римский запретил, поэтому его нельзя использовать?
Unconnected
Цитата
За код с goto у нас не задумываясь, и не смотря на любые прежние заслуги, увольняют без выходного пособия.


lol.gif Извиняюсь за оффтоп, не удержался:

Цитата
-Вы уволены!
-?? за что??
-А на 523 строчке?
SKVOZNJAK
Цитата
За код с goto у нас не задумываясь, и не смотря на любые прежние заслуги, увольняют без выходного пособия. Точка.

Тогда никогда не смотри HD рипы закоденные x264, там goto хватает. Мимоходом лишил кучу народа радости. В блоге какого-то программиста прочитал высказывание http://love5an.livejournal.com/tag/programming второе снизу.

Цитата
Опенсорс - помойка, и очень часто - пример того, как писать НЕ надо...

А архитектура виндовса - "грешно смеяться над убогими", столько раз переписывается сначала а получается всё тоже самое, только жрёт больше и нужную кнопку искать дольше. Если бы опенсорсный код был однозначно плохой, при минимальном финансировании софт на нём написанный вымер бы сам по себе, но он эволюционирует.
volvo
Цитата
Что, считается лучше так?
Я не пишу на Паскале, и на Дельфи тоже не пишу. Так что во-первых, в языке существуют другие структуры, позволяющие в подавляющем большинстве случаев обойтись без goto (в смысле, в подавляющем большинстве случаев, когда сторонники "лапшеобразного кода" рекомендуют использовать goto: например, немедленный выход из многократно вложенного цикла), а во-вторых, ни одна программа, тестирующая синтаксис проекта, не пропустит его, пока там есть по крайней мере один оператор goto. Какой на фиг goto, если программа-тестер исходного текста выдает предупреждение
  • когда перед знаком присваивания (или после него) пропущен пробел;
  • когда после знака, обозначающего комментарий, до начала самогО закомментированного текста стоит меньше или больше двух пробелов;
  • когда имя переменной описано в одном регистре, а использовано - в другом (хотя язык - не case-sensitive, как Си)
?
Lapp
Развитие дискуссии в сем треде интересно с точки зрения подтверждения некоторых широко известных положений, как то:
- любая тема, в которой употреблено название языка, но нет конкретики задачи, свалится к философствованию по поводу языков вообще;
- любая тема про языки вообще придет к обсуждению GOTO.

Короче, если кто-то еще считает, что Гостю мало досталось - милости прошу высказываться. Ежели про GOTO - then goto "соответствующая тема" (была, точно совершенно была, ищите сами, мне в лом)).

P.S.
Ну, чего прикопались? Гость уже целых две недели как начал изучать программирование на Си - конечно его потянуло поучить, как надо писать на Паскале! Помилуйте, как же без этого? а вдруг кто-то так и не узнает Истину?? А вы ему - goto, goto.. ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.