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

> Правила раздела!

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

 
 Ответить  Открыть новую тему 
> Ограничения для факториала
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

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


Какие ограничения нужно установить для числа n в программе, вычисляющей факториал этого числа n? Имею в виду, что нужно написать после readln(n), чтобы факториал с точки зрения алгебры вычислялся правильно?
Как указать, что число должно быть неотрицательное, натуральное и. т. д.? Подскажите, пожалуйста как это должно выглядеть?


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


Пионер
**

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

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


Цитата(Вячеслав Людской @ 27.09.2009 12:02) *

Какие ограничения нужно установить для числа n в программе, вычисляющей факториал этого числа n? Имею в виду, что нужно написать после readln(n), чтобы факториал с точки зрения алгебры вычислялся правильно?
Как указать, что число должно быть неотрицательное, натуральное и. т. д.? Подскажите, пожалуйста как это должно выглядеть?


Ну то что число неотрицательное проверить проще простова:
Код

if n>=0 then
   ...


Если хочешь сделать защиту от дурака, то пусть пользователь вводит не longint, а String. И потом проверяй на правильность ввода. Затем приведи к целому типу.

Вот пример на проверку. Может чо нито забыл проверить, но для начла хоть так:

Код

  {Ввод числа}
  write('Введите число: ');
  readln(ns);
  val(ns,n,kod);
  {..........}

  {Проверка на правильность ввода колличества строк}
  if (frac(n)=0) and (n>=1) and (n<=stmax) and (kod=0) then
  {Все хорошо, делаем что надо}


Сообщение отредактировано: kosyak -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

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


Для чистоты я бы описал n как целое и убрал его проверку на наличие дробной части (достаточно проверки на kod=0).
Еще хочу обратить внимание Вячеслава на сравнение с stmax, величина которого зависит от типа возвращаемого функцией факториала аргумента, и должно быть таким, чтобы в процессе вычисления функции не происходило переполнения. А у факториала это будет происходить уже при сравнительно малых n.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

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


Зачем надо присваивать String, необходимо же вычисолять факториал числа а тип STRING используется для текста, насколько я знаю?

Цитата

val(ns,n,kod);
{..........}


Что это значит? Я не спец, объясни пожалуйста.

Цитата
(frac(n)=0)


Этот оператор что делает?

Цитата
Для чистоты я бы описал n как целое и убрал его проверку на наличие дробной части (достаточно проверки на kod=0).
Еще хочу обратить внимание Вячеслава на сравнение с stmax, величина которого зависит от типа возвращаемого функцией факториала аргумента, и должно быть таким, чтобы в процессе вычисления функции не происходило переполнения.


Напиши пожалуйста как это будет выглядеть в паскале. Я тебя понял, но могу ошибиться.



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


Знаток
****

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

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


Цитата(Вячеслав Людской @ 27.09.2009 13:03) *

Зачем надо присваивать String, необходимо же вычисолять факториал числа а тип STRING используется для текста, насколько я знаю?


Так то оно так, но при вычислении факториала больше 12, число в результате выйдет за пределы типа Integer, тоесть больше 35000, а при N>16 ты уже не сможеш использовать даже Longint, поэтому при вычислении большых значений факториала используют тип стринг, в котором можжно хранить число длинной до 255 символов в виде текста.
Но алгоритм там посложнее...
Цитата

Что это значит? Я не спец, объясни пожалуйста.

val(s,n,kod); - это функция которая преобразовывает строчное значение в его числовое представление - смотри справку паскаля. S - переменная строчного типа(состоит только из цифр), N - переменная типа Real, или целого типа, Kod - переменная типа Integer - показывает код ошибки, если неудалось преобразовать строку в число
Цитата

Этот оператор что делает?

(frac(n)=0) - возвращает дробную часть аргумента, проверяет число целое или нет вобщем.

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


--------------------
Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик!
Я - системный аналитик!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Зачем надо присваивать String, необходимо же вычисолять факториал числа а тип STRING используется для текста, насколько я знаю?
Выше написано... Это защита от некорректного ввода данных. Мало ли, что пользователь введет в ответ на твой запрос... Вот чтобы отсеять любой неправильный ввод, придется читать ответ пользователя в строку, а потом ее уже конвертировать в число (Val).

Цитата
Этот оператор что делает?
У тебя Паскаль установлен? Открой справку и почитай, чтобы не было кучи вопросов "а что это? а почему так?". Подведи курсов к слову Val (или Frac), и нажми Ctrl+F1.

Цитата
Напиши пожалуйста как это будет выглядеть в паскале. Я тебя понял, но могу ошибиться.
Ну вот если понял, то напиши... Ошибешься - тогда будем смотреть где.

Добавлено через 3 мин.
Цитата
а при N>16 ты уже не сможеш использовать даже Longint
А что, при N=13 ты LongInt можешь использовать? Попробуй в таком случае, узнаешь много интересного.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

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

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


Цитата

А что, при N=13 ты LongInt можешь использовать? Попробуй в таком случае, узнаешь много интересного.

Каюсь... попутал, недосчитал unsure.gif


--------------------
Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик!
Я - системный аналитик!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

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


Ага спасибо всем good.gif , вроде написал, сдал, жду результата.


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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