IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Case..of
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


хех)) всем привет, я новенький=)
помогите пожалуйста задачу передлать... может похожая была в FAQ, но я не нашел
или можно не переделывать.. вобщем задание решить квадратное уравнение с помощью case..of
вот задача через if..then

uses crt;
var a,b,c,x,x3,x1,x2,d :real;
begin
clrscr;
writeln('vvedi abc'); readln(a,b,c);
d:=b*b-4*a*c;
if ((a<>0)and(d<0))then
writeln('reshenii net')
else if ((a=0)and(b=0)and(c=0)) then
writeln('x-luboe')
else if ((a=0)and(b=0)and(c<>0)) then
writeln('reshenii net')
else if ((a=0)and(b<>0))then begin
x:=-c/b;
writeln('reshenie odno',' ',x:4:4) end
else if ((a<>0)and(d=0)) then begin
x3:=-b/2/a;
writeln('kratnie korni x1=x2=',x3:4:4)end
else if ((a<>0)and(d>0)) then begin
x1:=(-b+d)/2/a;
x2:=(-b-d)/2/a;
writeln('dva kornya: x1=',x1:3:3,' ', 'x2=',x2:4:4); end;
readln;
end.

чес слово не знаю как ее делать =/
заранее благодарен))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Полностью от If избавиться не удастся, частично - можно:
uses crt;

function trunc(X: real): integer;
begin
trunc := system.trunc(X) + system.trunc(1000 * frac(X));
end;

function sign(X: real): integer;
begin
if X < 0 then sign := -1
else if X > 0 then sign := 1
else sign := 0;
end;

var
a,b,c,x,x3,x1,x2,d: real;
begin
clrscr;
writeln('vvedi abc'); readln(a,b,c);
d:=b*b-4*a*c;

case trunc( a ) of
0:
case trunc( b ) of
0:
case trunc( c ) of
0: writeln('x-luboe');
else
writeln('reshenii net');
end;

else
begin
x:=-c/b;
writeln('reshenie odno',' ',x:4:4)
end;

end;

else
case sign(d) of
-1: writeln('reshenii net');
0:
begin
x3:=-b/2/a;
writeln('kratnie korni x1=x2=',x3:4:4)
end;
+1:
begin
x1:=(-b+d)/2/a;
x2:=(-b-d)/2/a;
writeln('dva kornya: x1=',x1:3:3,' ', 'x2=',x2:4:4);
end;
end;
end;

readln;
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(romych @ 23.10.2006 23:51) *

чес слово не знаю как ее делать =/

Боюсь, я тоже не знаю. Просто так использовать переменную типа real в операторе case нельзя. Можно, конечно, извратиться и написать конструкцию типа
case a=0 of
true: ... ;
false: ... ;
end;

- только кому это надо?.. При работе с действительными числами естественно использовать сравнения и оператор if.
Есть другие мнения?

Цитата(volvo @ 24.10.2006 10:54) *

Полностью от If избавиться не удастся, частично - можно:

volvo, это же не эквивалентное решение! Ты округляешь данные числа до целых - но это может быть неприемлемо! Про точность в задаче не было ничего сказано, следовательно, она может быть любой. Иначе говоря, изначальный код и твой выдадут совсем разные результаты на определенных числах..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Извини, я НЕ работаю с округленными числами... Все, что мне нужно от округленного - это либо знак, либо порядок числа. Приведи пример разных результатов...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 24.10.2006 11:11) *

Извини, я НЕ работаю с округленными числами... Все, что мне нужно от округленного - это либо знак, либо порядок числа. Приведи пример разных результатов...

Виноват, назвал отбрасывание дробной части округлением. Это неверно, конечно, но в данном случае несущественно. Пример вот:
a = 0.9
b = 0
c = 0.9
Твой код выдаст "х - любое", хотя верный ответ "решений нет".


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Меня терзает смутное сомнение, что переопределение функции Trunc осталось незамеченным. Это так?

Выдает
Цитата
vvedi abc
0.9 0 0.9
reshenii net
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 24.10.2006 11:41) *

Меня терзает смутное сомнение, что переопределение функции Trunc осталось незамеченным. Это так?

Так smile.gif
Ладно, точность повышена с целых до тсячных. Пример тогда такой:
a = 1e-10
b = 0
c = 1e-10

Хотя, с переопределением все же можно выкрутиться, согласен. Например, если следовать авторскому сравнению чисел, то можно сделать, наверное, так:
function trunc(X: real): integer;
begin
trunc := Byte(x<>0)
end;

Короче, в целом все получается smile.gif. Беру свои слова обратно.

Сообщение отредактировано: volvo -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


я тоже перед вами зивиняюсь, но
1)без функции. функции мы еще по идее не проходили
2) Задание. Изменить приведенную программу, используя оператор варианта CASE.
я не знаю, полностью или частично, просто вот это сказано..
могу если надо блок схему выложить..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(romych @ 25.10.2006 0:21) *

1)без функции. функции мы еще по идее не проходили
2) Задание. Изменить приведенную программу, используя оператор варианта CASE.

Если так, то рекомендую воспользоваться моим советом (см. сообщение #3).
Должно получиться примерно так:
var
a,b,c,x,x3,x1,x2,d :real;

begin
writeln('vvedi abc'); readln(a,b,c);
d:=b*b-4*a*c;
case a=0 of
true: case b=0 of
true: case c=0 of
true: WriteLn('x - luboe');
false: WriteLn('reshenii net');
end;
false: begin
x:=-c/b;
writeln('reshenie odno',' ',x:4:4)
end
end;
false: case d<0 of
true: WriteLn('reshenii net');
false: case d=0 of
true: begin
x3:=-b/2/a;
writeln('kratnie korni x1=x2=',x3:4:4)
end;
false: begin
x1:=(-b+d)/2/a;
x2:=(-b-d)/2/a;
writeln('dva kornya: x1=',x1:3:3,' ', 'x2=',x2:4:4);
end;
end;
end;
end;
readln;
end.

Проверь логику, я мог ошибиться.

PS
Дополнительно обращаю внимание, что сравнение переменных типа real посредством простых =, <, >, <> - некорректно. Для невычисляемых переменных a, b, c это еще ничего, но d может взбрыкнуть. Один из возможных выходов - определить некоторую точность Е, с которой производятся вычисления, и дальше вместо, скажем,
d = 0
писать так:
Abs(d-0) < E


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 21.09.2020 18:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name