Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Выполнение программы простой структуры

Автор: cruising 12.04.2010 2:28

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

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 12.04.2010 7:55

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

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


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

Автор: TarasBer 12.04.2010 14:03

> Или, может, имются в виду вычислительные возможности компьютера?..

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

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

Такой записью вы себя ограничиваете. Возводить в целую степень и извлекать нечётные корни можно и из отрицательных чисел. И из нуля.

Автор: cruising 12.04.2010 19:42

Если я убираю строку с оператором 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 12.04.2010 19: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;


Автор: cruising 12.04.2010 19:59

Цитата(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я 12.04.2010 20:03

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

Наверняка ошибка до, а не после. Проверь, стоит ли ; после оператора, стоящего перед function

Автор: TarasBer 12.04.2010 20:03

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

Автор: cruising 12.04.2010 20:21

Цитата(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 12.04.2010 21:02

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

Автор: cruising 12.04.2010 21:10

Цитата(TarasBer @ 12.04.2010 17:02) *

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

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

Автор: Ozzя 12.04.2010 21:55

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

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

Автор: cruising 12.04.2010 23:17

Цитата(Ozzя @ 12.04.2010 17:55) *

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

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

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

Автор: TarasBer 13.04.2010 13:05

> Да я не волоку вообще в этом, я заочник, разбираться надо долго с этим, времени нет!

Плохо.

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

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

Как использовать функцию - вообще интуитивно очевидно должно быть, но раз ты не "волочешь" и не хочешь разбираться, то толку тебе помогать.

Автор: cruising 13.04.2010 18:18

TarasBer, ну да так то, руки дойдут, разбирусь как-нибудь, спасибо зо то что, хотя бы попытался мне помочь.

Автор: Гость 25.04.2010 17:53

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 25.04.2010 18:05

Ah - двумерный массив, значит для обращения к нему требуется 2 индекса. В той строчке везде по два, как положено, но последнее обращение - с одним индексом. Куда второй потерялся?

Автор: Гость 25.04.2010 18:17

В блок схеме я писал в том месте ...Аh[1,n-1]

Автор: Tau 30.05.2010 19:16

Цитата(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 30.05.2010 19:34

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

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

Автор: Гость 30.05.2010 20:13

Цитата(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 31.05.2010 6:56

Цитата(Гость @ 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 31.05.2010 13:47

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

Добавлено через 1 мин.
Кстати, а зачем условие в блоке if заключать в скобчки?

Автор: SKVOZNJAK 31.05.2010 19:28

Цитата
1.Выход из функции все должен находится перед закрывающем операндом.

Зря смеётесь, примерно так часто и делается, просто по общепринятым правилам некоторых сообществ нельзя говорить о том что реально применяется на практике. По ходу человек готовится писать на чистом Си, без ООП, а там как раз в сложных ситуациях применяется или бреак или гото. Причём код с бреак читается намного хуже чем с гото. Подставьте в пример кода гото и он заработает на все сто, за исключением ошибок в синтаксисе. Достаточно посмотреть примеры опенсорсных сишных программ чтобы уяснить какие методы можно применять в реальных программах а какие в показательных учебных.

Автор: volvo 31.05.2010 19:56

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

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

Цитата
Достаточно посмотреть примеры опенсорсных сишных программ чтобы уяснить какие методы можно применять в реальных программах а какие в показательных учебных.
Опенсорс - это "я так делаю, потому что моя левая пятка так захотела, или мне так проще, и плевать на мнение остальных". Не далее, как сегодня я уже видел подобный хит: http://forum.pascal.net.ru/index.php?s=&showtopic=25886&view=findpost&p=145352 (а потом опять будут разговоры, что программа не работает, и опять во всем будут винить ОС).

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

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

Автор: TarasBer 31.05.2010 20:05

> За код с 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 31.05.2010 21:30

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


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

Цитата
-Вы уволены!
-?? за что??
-А на 523 строчке?

Автор: SKVOZNJAK 1.06.2010 2:12

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

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

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

А архитектура виндовса - "грешно смеяться над убогими", столько раз переписывается сначала а получается всё тоже самое, только жрёт больше и нужную кнопку искать дольше. Если бы опенсорсный код был однозначно плохой, при минимальном финансировании софт на нём написанный вымер бы сам по себе, но он эволюционирует.

Автор: volvo 1.06.2010 14:45

Цитата
Что, считается лучше так?
Я не пишу на Паскале, и на Дельфи тоже не пишу. Так что во-первых, в языке существуют другие структуры, позволяющие в подавляющем большинстве случаев обойтись без goto (в смысле, в подавляющем большинстве случаев, когда сторонники "лапшеобразного кода" рекомендуют использовать goto: например, немедленный выход из многократно вложенного цикла), а во-вторых, ни одна программа, тестирующая синтаксис проекта, не пропустит его, пока там есть по крайней мере один оператор goto. Какой на фиг goto, если программа-тестер исходного текста выдает предупреждение?

Автор: Lapp 1.06.2010 16:10

Развитие дискуссии в сем треде интересно с точки зрения подтверждения некоторых широко известных положений, как то:
- любая тема, в которой употреблено название языка, но нет конкретики задачи, свалится к философствованию по поводу языков вообще;
- любая тема про языки вообще придет к обсуждению GOTO.

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

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