for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Игры Разума
   :: Помощь сайту :: 

Игры разума 2
leonid
Автор

Сообщений: 2594
Откуда: Рига
Дата: 14.03.07 13:27:48ОтветитьЦитировать
Поскольку здесь появилась такая тема, решил тоже выставить пару задачек для всеобщего обозрения. Первая из них - задачка чисто из практики, а вторая навеяна одним недавним обсуждением на данном форуме. Итак

1. Думаю нет надобности объяснять, что такое страховой полис. Страховой полис может быть заключен с произвольного числа (m.dt) на произвольное число месяцев (m.km). Для определенности будем считать, что m.dt лежит в промежутке от 01.01.2000 до 01.01.2010, а m.km - целое число от 1 до 30. В полисе нужно записать фразу: "Полис действителен с ... по ...". Для этого нужно определить дату, которую надо записать после "по". Для вычисления этой даты пишется функция
Function End_date  
  lparameter m.dt, m.km  
  Return ...
Задание - дописать эту функцию, желательно покороче.

2. Строится курсор
RAND(-1)  
  CREATE CURSOR tmp (id i, f1 i, sum i)  
  FOR i=1 TO 100000  
  	INSERT INTO tmp VALUES (i, INT(RAND()*10+1), 0)  
  NEXT
Требуется в поле sum загнать сумму f1 нарастающим итогом, т.е. в первой строке sum должно быть равно f1, во второй sum должно быть равно сумме f1 из первой и второй строки, и т.д. Конечно, любой фоксовский программист может элементарно это сделать с помощью операторов scan и replace. Но задание как раз состоит в том, чтобы сделать это с помощью оператора update. А именно, нужно дополнить следующий код
m.sc=SECONDS()  
  UPDATE ...  
  ?SECONDS()-m.sc
и в качестве ответа привести дополненный код и количество секунд, за которое этот код выполняется.

P.S. Вторая задачка для VFP9



Исправлено: leonid, 14.03.07 13:29
Ratings: 0 negative/0 positive

Re: Игры разума 2
piva
[Болтун]

Сообщений: 18533
Откуда: Курган
Дата: 14.03.07 13:31:54ОтветитьЦитировать
Дык первый - GoMonth(m.dt,12*кол-во лет)

Воторой уже обсуждался до исходников


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Игры разума 2
AleksM
[Админ]

Сообщений: 17704
Дата: 14.03.07 13:35:52ОтветитьЦитировать
Цитата:
Дык первый - GoMonth(m.dt,12*кол-во лет)
А на 12 зачем множить и нужно ещё один день от результата отнять.


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive

Re: Игры разума 2
Владимир Максимов

Сообщений: 13839
Откуда: Москва
Дата: 14.03.07 13:36:30ОтветитьЦитировать
Уточняющие вопросы:

1) Какая дата должны быть в следующих случаях

31 января + 1 месяц = ?
28 феврала + 1 месяц = ?

Другими словами, "один месяц" - это сколько дней?
Ratings: 0 negative/0 positive

Re: Игры разума 2
piva
[Болтун]

Сообщений: 18533
Откуда: Курган
Дата: 14.03.07 13:37:32ОтветитьЦитировать
? Gomonth({^2001.01.01},120)
Все равно первое число получается. Или должно было быть 31.12 что ли ?


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Игры разума 2
piva
[Болтун]

Сообщений: 18533
Откуда: Курган
Дата: 14.03.07 13:38:34ОтветитьЦитировать
Кстати - возможно завтра появится специальный раздел с рабочим названием "Игры разума" туда все и перекидаем из курилки


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Игры разума 2
AleksM
[Админ]

Сообщений: 17704
Дата: 14.03.07 13:38:54ОтветитьЦитировать
Насколько я помню правила оформления полиса, то да - 31.12


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive

Re: Игры разума 2
piva
[Болтун]

Сообщений: 18533
Откуда: Курган
Дата: 14.03.07 13:43:52ОтветитьЦитировать
Цитата:
от 01.01.2000 до 01.01.2010
А не по


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Игры разума 2
AleksM
[Админ]

Сообщений: 17704
Дата: 14.03.07 13:45:21ОтветитьЦитировать
Ну это уже тонкости и уловки страхователя.


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive

Re: Игры разума 2
Foxtrot

Сообщений: 3370
Откуда: Куда:
Дата: 14.03.07 14:07:06ОтветитьЦитировать
C такими ответами мы так и останемся в Курилке
Кодить сегодня ктонить будет или нет?


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Игры разума 2
leonid
Автор

Сообщений: 2594
Откуда: Рига
Дата: 14.03.07 14:12:28ОтветитьЦитировать
Владимир Максимов
Уточняющие вопросы:
1) Какая дата должны быть в следующих случаях

31 января + 1 месяц = ?
28 феврала + 1 месяц = ?

Другими словами, "один месяц" - это сколько дней?

Мне кажется, что интуитивное восприятие вполне совпадает с принятым у страховщиков:
Полис на 1 месяц
С 31.01.2000 по 29.02.2000
С 31.01.2001 по 28.02.2001
С 28.02.2000 по 27.03.2000
С 28.02.2001 по 27.03.2001



Исправлено: leonid, 14.03.07 14:14
Ratings: 0 negative/0 positive

Re: Игры разума 2
Владимир Максимов

Сообщений: 13839
Откуда: Москва
Дата: 14.03.07 14:21:27ОтветитьЦитировать
leonid
Владимир Максимов
Уточняющие вопросы:
1) Какая дата должны быть в следующих случаях

31 января + 1 месяц = ?
28 феврала + 1 месяц = ?

Другими словами, "один месяц" - это сколько дней?

Мне кажется, что интуитивное восприятие вполне совпадает с принятым у страховщиков:
Полис на 1 месяц
С 31.01.2000 по 29.02.2000
С 31.01.2001 по 28.02.2001
С 28.02.2000 по 27.03.2000
С 28.02.2001 по 27.03.2001

Очень интересно! Если 28 февраля + 1 месяц = 27 марта, то какое число будет 28 января + 2 месяца? А 29 января + 2 месяца?

"Интуитивно" здесь просто "не работает". Эта задача опять из разряда "разница дат в формате лет/месяцев/дней". Нет у нее решения. Именно в силу того, что "месяц" - это не абсолютная величина, а относительная. Это даже не календарный месяц, а неизвестно что. Это нечто, зависящее от текущей календарной даты, "интуитивного" понимания того человека, который происзводит расчет, погды, положения звезда на небе и вообще от чего угодно, кроме количества дней.
Ratings: 0 negative/0 positive

Re: Игры разума 2
AleksM
[Админ]

Сообщений: 17704
Дата: 14.03.07 14:46:27ОтветитьЦитировать
По второму можно так (RAND() убрал чтоб проверять было легче)
CREATE CURSOR tmp (id i, f1 i, sum i)    
    FOR i=1 TO 100000  
    	INSERT INTO tmp VALUES (i, i, 0)    
    NEXT  
    
  dd=-1  
    
  SELECT a.id, a.f1, Tot(a.f1) tot FROM Tmp a  
    
  FUNCTION Tot  
    
  PARAMETERS ff  
    
  	dd=dd+ff  
  RETURN dd  
    
 *(a.f1+(SELECT SUM(b.f1) FROM Tmp b WHERE b.id=a.id-1))


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive

Re: Игры разума 2
PaulWist

Сообщений: 13047
Дата: 14.03.07 14:54:59ОтветитьЦитировать
Конечно можно толко не нужно

CREATE CURSOR tmp (id i, f1 i, sum i)      
      FOR i=2 TO 3    
      	INSERT INTO tmp VALUES (i, i, 0)      
      NEXT    
        
    dd=-1    
        
    SELECT a.id, a.f1, Tot(a.f1) tot FROM Tmp a    
        
    FUNCTION Tot    
        
    PARAMETERS ff    
        
    	dd=dd+ff    
    RETURN dd


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive

Re: Игры разума 2
leonid
Автор

Сообщений: 2594
Откуда: Рига
Дата: 14.03.07 14:57:58ОтветитьЦитировать
2AlexM, PaulWist
Так, или примерно так, конечно можно, только задание было не такое.
Ratings: 0 negative/0 positive

Re: Игры разума 2
AleksM
[Админ]

Сообщений: 17704
Дата: 14.03.07 15:02:21ОтветитьЦитировать
А так:
CREATE CURSOR tmp (id i, f1 i, sum i)        
        FOR i=2 TO 3      
        	INSERT INTO tmp VALUES (i, i, 0)        
        NEXT      
    
  GO top  
            
      dd=-f1  
            
      SELECT a.id, a.f1, Tot(a.f1) tot FROM Tmp a      
            
      FUNCTION Tot      
            
      PARAMETERS ff      
            
      	dd=dd+ff      
      RETURN dd


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive

Re: Игры разума 2
AleksM
[Админ]

Сообщений: 17704
Дата: 14.03.07 15:12:49ОтветитьЦитировать
И так не годится
CREATE CURSOR tmp (ID i, f1 i, SUM i)  
  FOR i=1 TO 1000  
  	INSERT INTO tmp VALUES (i, i, 0)  
  NEXT  
    
  GO TOP  
    
  dd=-f1  
    
  SELECT a.ID, a.f1, Tot(a.f1) Tot FROM tmp a   INTO CURSOR cTmp  
    
  UPDATE tmp SET SUM=(SELECT cTmp.Tot FROM cTmp WHERE cTmp.ID=tmp.ID)  
  SELECT tmp  
  BROW  
    
  FUNCTION Tot  
    
  PARAMETERS ff  
    
  dd=dd+ff  
  RETURN dd


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.




Исправлено: AleksM, 14.03.07 15:14
Ratings: 0 negative/0 positive

Re: Игры разума 2
PaulWist

Сообщений: 13047
Дата: 14.03.07 15:14:11ОтветитьЦитировать
Проще надо быть

CREATE CURSOR tmp (id i, f1 i, sum i)    
    FOR i=1 TO 10    
    	INSERT INTO tmp VALUES (i, i, 0)    
    NEXT  
    
  m.aa = 0  
    
  UPDATE tmp SET sum = ff(f1)  
    
  BROWSE   
    
  FUNCTION ff(f1)   
  m.aa = m.aa + m.f1  
  RETURN m.aa  
  ENDFUNC


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive

Re: Игры разума 2
leonid
Автор

Сообщений: 2594
Откуда: Рига
Дата: 14.03.07 15:16:49ОтветитьЦитировать
Владимир Максимов
Очень интересно! Если 28 февраля + 1 месяц = 27 марта, то какое число будет 28 января + 2 месяца? А 29 января + 2 месяца?
"Интуитивно" здесь просто "не работает". Эта задача опять из разряда "разница дат в формате лет/месяцев/дней". Нет у нее решения. Именно в силу того, что "месяц" - это не абсолютная величина, а относительная. Это даже не календарный месяц, а неизвестно что. Это нечто, зависящее от текущей календарной даты, "интуитивного" понимания того человека, который происзводит расчет, погды, положения звезда на небе и вообще от чего угодно, кроме количества дней.
Мне почему-то казалось, что это не должно вызвать особых затруднений. По крайней мере у тех, кто регулярно страхует автомобили. Думаю, многие из них знают, что застраховать автомобиль 29 января на два месяца (с 29 января по 28 марта) не так выгодно, как сначала на 1 месяц с 29 января по 28 февраля, а потом еще на один с 1 марта по 31 марта.
28 января + 2 месяца - 28.01.2007-27.03.2007
29 января + 2 месяца - 29.01.2007-28.03.2007
Ratings: 0 negative/0 positive

Re: Игры разума 2
AleksM
[Админ]

Сообщений: 17704
Дата: 14.03.07 15:16:53ОтветитьЦитировать
Точна. Вот тока 100000 в исходных условиях многовато будет.


------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут писать в этом форуме.

On-line: 41 and Guests: 41


© 2000-2019 Fox Club 
Яндекс.Метрика