Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
дана функция вычисления факториала
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION factorial1 (@n int) 
RETURNS int
AS
BEGIN
	declare @X INT
	declare @i int
    declare @fact int
	select @i=2
	select @x=1
while @i<=@n begin
select @x=@x*@i
select @i=@i+1
end
select @fact=@x
	RETURN @fact 

END
GO
нужно Самостоятельно доработать данную функцию, чтобы она вычисляла факториал числа для 0 и 1 с использованием оператора case
15 май 11, 18:10    [10654790]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
iljy
Member

Откуда:
Сообщений: 8711
andresan,

а так типа не вычисляет??
15 май 11, 18:49    [10654887]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
ну задание такое )))
15 май 11, 23:33    [10655628]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
iljy
Member

Откуда:
Сообщений: 8711
andresan,

а куда тут предполагается case впихнуть? Можно написать рекурсивную, там действительно будет case использоваться. Но как-то это слишком для "доработки"
16 май 11, 00:00    [10655692]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
незнаю...:) вот задание такое. наверно чтоб только он факториал 0 и 1 считал.. а другие не считал
16 май 11, 00:14    [10655719]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
iljy
Member

Откуда:
Сообщений: 8711
andresan
незнаю...:) вот задание такое. наверно чтоб только он факториал 0 и 1 считал.. а другие не считал

0! и 1! - это 1. Так что case для них ну совсем не нужен. Возможно, как я сказал, имеется ввиду написание рекурсивной функции вычисления факториала.
16 май 11, 01:24    [10655847]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
М.б. надо создать функцию вычисления факториала как такового? Ну а потом ее вызвать для 0! и для 1! ?
16 май 11, 06:57    [10655975]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
Наверно!
16 май 11, 09:19    [10656189]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
andresan
Наверно!
А может, Вам задали сосчитать 100! ?
16 май 11, 09:21    [10656191]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
andresan
Наверно!
Да-с, круто... Дык что вам задали-то?
16 май 11, 09:28    [10656216]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
для 0! и 1!
16 май 11, 09:40    [10656273]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
с импользованием CASE
16 май 11, 09:41    [10656275]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
вот все задание:
Пример: Создание скалярной функции вычисления факториала
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION factorial1 (@n int)
RETURNS int
AS
BEGIN
declare @X INT
declare @i int
declare @fact int
select @i=2
select @x=1
while @i<=@n begin
select @x=@x*@i
select @i=@i+1
end
select @fact=@x
RETURN @fact

END
GO
Пример использования такой функции в запросе
SELECT idUnum, Ocenka, UDate, idSNum, idPNum
FROM tbUsp
WHERE (dbo.factorial1(3) = idUnum). Самостоятельно доработать данную функцию, чтобы она вычисляла факториал числа для 0 и 1 с использованием оператора case.
16 май 11, 09:50    [10656317]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
iljy
Member

Откуда:
Сообщений: 8711
andresan,

откуда такие дурацкие задания беруться? Функция написана по-идиотски
CREATE FUNCTION factorial1 (@n int) 
RETURNS int
AS
BEGIN
	declare @X INT
	set @x=1
	while @n >=2
	begin
		set @x=@x*@n
		set @n = @n-1
	end
	RETURN @x
END
И куда тут case пихать? Перепишите через рекурсию, в третий раз повторяю.
16 май 11, 09:59    [10656359]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
:):) хорошо передам преподавателю :) а как через рекурсию?
16 май 11, 10:00    [10656366]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
andresan,

DECLARE @N INT
SET @N=0

DECLARE @X INT
DECLARE @i INT
DECLARE @fact INT
SELECT  @i = 2
SELECT  @x = 1
WHILE @i <= @n 
    BEGIN
        SELECT  @x = @x * @i
        SELECT  @i = @i + 1
    END
SELECT  @fact = @x
SELECT  CASE @N WHEN 0 THEN 'нуль был тут' WHEN 1 THEN 'единица детектед' ELSE STR(@fact) END
Типа такого?
16 май 11, 10:00    [10656368]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
kDnZP, а как сделать так чтоб функция была.. и я мог ее использовать в таблице.. где будет 0 и 1 выводила такие сообщения?
16 май 11, 10:07    [10656405]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
ALTER FUNCTION [dbo].[factorial1] (@n int)
RETURNS int
AS
BEGIN
	declare @fact int
	if @n = 0
	return 1
	if @n > 0
	begin
		set @fact = @n
		while @n > 0
		begin
			set @n = @n - 1
			if @n > 0
				set @fact = @fact * @n
		end
	end
	return @fact

END

Вызов
SELECT [dbo].factorial1(0) as [0!],[dbo].factorial1(1) as [1!],[dbo].factorial1(5) as [5!]
16 май 11, 10:09    [10656412]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
andresan, ну кагбы я вам размышлизм на тему поставленной задачи дал. Готовое решение не выдам, ибо нужно чтобы и вы чего-то полезного сделали.

* Не в обиду, но я не решаю учебных задач, потому как считаю это вредным для будущего специалиста.
** Да, и учтите, на дурацкое задание - дурацкое решение. Т.е. я на вашем месте сделал бы 2 варианта - один дурацкий, а другой правильный, без всяких глупостей. Сначала нужно показывать и доказывать правильный, но при этом иметь в запасе выполненный по заданию, чтобы если спор с преподавателем зайдет в глухой угол - выдать его и сказать "Хотели? Получайте."
16 май 11, 10:21    [10656493]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Подправить...
ALTER FUNCTION [dbo].[factorial1] (@n int)
RETURNS int
AS
BEGIN
	declare @fact int
	if @n = 0
		return 1
	if @n > 0 and @n <= 12
	begin
		set @fact = @n
		while @n > 0
		begin
			set @n = @n - 1
			if @n > 0
				set @fact = @fact * @n
		end
	end
	return @fact
END
Вызов:
SELECT [dbo].factorial1(-2) as [-2!]
      ,[dbo].factorial1(0) as [0!]
      ,[dbo].factorial1(1) as [1!]
      ,[dbo].factorial1(5) as [5!]
      ,[dbo].factorial1(12) as [12!]
      ,[dbo].factorial1(13) as [13!]

Результат:

К сообщению приложен файл. Размер - 1Kb
16 май 11, 10:39    [10656616]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
нужно сделать так.. чтоб если 0 и 1 выводило 0!=1 1!=1 а другие числа просто значение..
16 май 11, 17:11    [10660042]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
andresan
Member

Откуда:
Сообщений: 13
через CASE
16 май 11, 17:28    [10660172]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
iljy
Member

Откуда:
Сообщений: 8711
andresan,

https://www.sql.ru/forum/actualtopics.aspx?bid=9
16 май 11, 17:29    [10660181]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
andresan,
Там в конце есть case
if object_id('dbo.Factiorial', 'fn') is not null drop function dbo.Factiorial
go

Create function dbo.Factiorial(@n int)
returns varchar(max)
as
Begin
 declare @iter int, @x numeric(27), @y numeric(27)
 declare @t table(n int identity primary key clustered, a numeric(27) not null)

 insert into @t(a) values (1)
 
 set @iter = 1

 while @iter <= @n
 begin
  select @x=0, @y=0
  update @t set a=(a*@iter+@x)%1000000000000000000000000000, @x=@y, @y=floor((a*@iter+@x)/1000000000000000000000000000) from @t
  if @y > 0 insert into @t(a) select @y

  set @iter = @iter + 1
 end

 select @iter = count(*) from @t
 return cast((select case when n = @iter then cast(a as varchar) else right('000000000000000000000000000'+cast(a as varchar), 27) end from @t order by n desc for xml path('')) as varchar(max))
End -- Create function dbo.Factiorial
go

set nocount on
set statistics time on

select dbo.Factiorial(100)
select dbo.Factiorial(33)

set statistics time off
go
16 май 11, 17:35    [10660236]     Ответить | Цитировать Сообщить модератору
 Re: Пожайлуста помогите с оператором case  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
andresan
нужно сделать так.. чтоб если 0 и 1 выводило 0!=1 1!=1 а другие числа просто значение..
Что значит просто значение? Это уже другая постановка... Где об этом ранее сказано?
Такая задача выединого яйца не стоит...
Здесь все показано. Ваша задача это скомпановать... Хоть что-то сами сделайте. И посмотрите описание оператора CASE.
16 май 11, 19:02    [10660759]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить