Консультация № 176033
14.01.2010, 14:30
43.34 руб.
0 27 3
Доброго времени суток, уважаемые эксперты, вот еще одна задачка, помогите пожалуйста с решением. Буду очень благодарин.

4. Даны натуральное число N и действительное число X.
Вычислить: sin (1! * X) + sin (2! * X) + sin (3! * X) + ... + sin (N! *X).


Зарание спасибо

Обсуждение

Неизвестный
14.01.2010, 14:43
общий
14.01.2010, 17:00
это ответ
Здравствуйте, Верещака Андерй Павлович!
Решение в приложении.

Приложение:
{$N+}
function Factorial(n: extended): extended;
var
i: longint;
m: extended;
begin
m := 1.0;
for i := 2 to round(n) do
m := m * i;
Factorial := m;
end;

var
x, m: extended;
i, n: longint;
begin
ReadLn(x, n);
m := 0.0;
for i := 1 to n do
m := m + sin(Factorial(i) * x);
WriteLn(m);
end.
Неизвестный
14.01.2010, 15:56
общий
это ответ
Здравствуйте, Верещака Андерй Павлович.

В решении Колесникова Ивана Владимировича производится много лишних умножений. Можно сделать гораздо проще: не вычислять факториал целиком при каждой итерации, а домножать на очередное число прямо в цикле. Кроме того, совершенно незачем каждый раз факториал умножать на X — достаточно умножать именно X на i. Программа приведена в приложении.

Успехов!

Приложение:
program _176033;
var
x, s: extended;
i, n: longint;
begin
write( 'Введите X: ' ); readln( x );
write( 'Введите число членов ряда N: ' ); readln( n );
s := 0;
for i := 1 to n do begin
x := x*i;
s := s + sin( x );
end;
WriteLn( 'Сумма ряда = ', s:10:4 );
end.
Неизвестный
14.01.2010, 16:10
общий
14.01.2010, 17:06
это ответ
Здравствуйте, Верещака Андерй Павлович.
Смотрите приложение.


Приложение:
VAR
X : Real;
N : Integer;
I : integer;
R : Real;

Function Factorial(F: Word):LongInt;
var k,m : LongInt;
begin
M :=1;
For k := 1 to F do
m := m*k;
Factorial:=M;
end;

begin
Write('X=');
ReadLn(X);
Write('N=');
ReadLn(N);
R := 0;
For I := 1 to N do
begin
R := R + sin(Factorial(i) * x);
end;
WriteLn('=',R:8:4);
end.
Неизвестный
14.01.2010, 16:17
общий
Колесников Иван Владимирович:
1. Факториал - это целочисленное число, а не как у Вас вещественное. Функция вычисления факториала соответственно не работает.
2. Если Вы используете тип extended, то необходимо было указать еще дополнительные параметры компиляции. Поставить в самом начале {$N+}, а в конце программы {$N-}.
А вообще я считаю, что данный тип данных здесь использован необоснованно, т.к. точности Real должно хватить вполне.

amnick
Краткость кода впечатляет, замечания только по типу extended такие же как и к автору ответа №1 (пункт 2).
Неизвестный
14.01.2010, 16:23
общий
Модераторы:
Пожалуйста исправьте мой ответ. В приложении должно быть так:
Код:
function Factorial(n: extended): extended;
var
i: longint;
m: extended;
begin
m := 1.0;
for i := 2 to Round(n) do
m := m * i;
Factorial := m;
end;

var
x, m: extended;
i, n: longint;
begin
ReadLn(x, n);
m := 0.0;
for i := 1 to n do
m := m + sin(Factorial(i) * x);
WriteLn(m);
end.
Неизвестный
14.01.2010, 16:30
общий
Disasm:
Использование в качестве типа результата факториала Word не желательно, лучше Longint. Иначе Word, максимальное значение которого 65535, быстро переполнится. Например, факториал 9 уже равен 362880, что больше 65535.
давно
Старший Модератор
31795
6196
14.01.2010, 16:38
общий
Колесников Иван Владимирович:
Подскажите какое значение факториала у Вас будет при N=1?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.01.2010, 16:42
общий
Зенченко Константин Николаевич:
1. Т. к. сначала m := 1.0, а цикл не выполнится ни разу т. к. 1 < 2.
давно
Старший Модератор
31795
6196
14.01.2010, 16:43
общий
Колесников Иван Владимирович:
function Factorial(n: extended): extended;
. . .
i, n: longint;
. . .
Factorial(i)

Разберитесь с типами данных. И проверьте свой код компилятором.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.01.2010, 16:49
общий
Зенченко Константин Николаевич:
Все работает.
Pascal умеет автоматически преобразовывать Integer в Extended (но не наоборот, поэтому приходится использовать Round, который я и прошу добавить).
Неизвестный
14.01.2010, 16:53
общий
Колесников Иван Владимирович:
Цитата: 230753
Disasm:
Использование в качестве типа результата факториала Word не желательно, лучше Longint. Иначе Word, максимальное значение которого 65535, быстро переполнится. Например, факториал 9 уже равен 362880, что больше 65535.

Согласен, спасибо за замечание. Тип для результата как то проследил. За Паскалем последний раз сидел 2-3 года назад. :)

Модераторы:
Прошу исправить мой ответ.

Новый листинг:
VAR
X : Real;
N : Integer;
I : integer;
R : Real;

Function Factorial(F: Word):LongInt;
var k,m : LongInt;
begin
M :=1;
For k := 1 to F do
m := m*k;
Factorial:=M;
end;

begin
Write('X=');
ReadLn(X);
Write('N=');
ReadLn(N);
R := 0;
For I := 1 to N do
begin
R := R + sin(Factorial(i) * x);
end;
WriteLn('=',R:8:4);
end.
давно
Старший Модератор
31795
6196
14.01.2010, 16:53
общий
Колесников Иван Владимирович:
Цитата: 230753
1. Т. к. сначала m := 1.0, а цикл не выполнится ни разу т. к. 1 < 2.

Только особенность компиляции цикла FOR в паскале, дает правильный результат, т.к. там идет двойная проверка, в начале цикла и в конце.
seg000:0024 mov ax, 2
seg000:0027 xor dx, dx
первая проверка
seg000:0029 cmp dx, [bp+var_E]
seg000:002C jg short loc_1006C
seg000:002E jl short loc_10035
seg000:0030 cmp ax, [bp+var_10]
seg000:0033 ja short loc_1006C

seg000:0035 loc_10035:
seg000:0035 mov [bp+var_8], ax
seg000:0038 mov [bp+var_6], dx
seg000:003B jmp short loc_10045
seg000:003D loc_1003D:

seg000:003D add [bp+var_8], 1
seg000:0041 adc [bp+var_6], 0

seg000:0045 loc_10045:начало тела цикла

вторая проверка
seg000:0062 cmp dx, [bp+var_E]
seg000:0065 jnz short loc_1003D
seg000:0067 cmp ax, [bp+var_10]
seg000:006A jnz short loc_1003D
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.01.2010, 16:58
общий
Зенченко Константин Николаевич:
Но это не является ошибкой. Я использую эту возможность для своего удобства. А вообще то факториал можно вычислять по-разному (рекурсией, например). Пожалуйста, исправьте мой ответ, добавив Round в указанном месте, чтобы программа являлась синтаксически правильной.
давно
Старший Модератор
31795
6196
14.01.2010, 17:19
общий
Колесников Иван Владимирович:
Цитата: 230753
А вообще то факториал можно вычислять по-разному (рекурсией, например)

Я знаю.
Код:
var
n:integer;
s,x:real;
{функция факториала}
function F(a:integer):longint;
begin
if a>0 then F:=F(a-1)*a
else F:=1;
end;
begin
{вводим N}
repeat
write('Enter N:');
readln(n);
until n>0;
{вводим Х}
write('Enter X:');
readln(x);
s:=0;
{считаем сумму}
while n>0 do
begin
s:=s + sin(F(n)*x);
dec(n)
end;
{выводим результат}
writeln('Result:',s);
readln;
end.

И на одну переменную меньше.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
14.01.2010, 17:23
общий
Колесников Иван Владимирович:
Disasm:

Господа, внимательней относитесь к ответам на платные вопросы.
Поспешность тут не нужна.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.01.2010, 17:23
общий
Зенченко Константин Николаевич:
Только памяти такая функция вычисления факториала расходует намного больше. И грозит переполнением стека. Поэтому я её и не использовал в ответе.
давно
Мастер-Эксперт
425
4118
14.01.2010, 17:55
общий
Колесников Иван Владимирович:
Цитата: 230753
Только памяти такая функция вычисления факториала расходует намного больше. И грозит переполнением стека. Поэтому я её и не использовал в ответе.

А Вы, случаем, не TurboPascal используете, что так озаботились памятью и стеком? ТР - это изврат.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
14.01.2010, 18:00
общий
sir Henry:
А что кроме Turbo Pascal и Object Pascal (Delphi) можно использовать?
Автор вопроса, скорее всего, школьник или студент. Там в основном используют Turbo Pascal. Или я ошибаюсь?
давно
Мастер-Эксперт
425
4118
14.01.2010, 18:05
общий
Колесников Иван Владимирович:
Здесь уже было замечание про поспешность, добавлю и свои пять копеек. Вот этот вот кусок кода:
Код:
begin
ReadLn(x, n);

никуда не годится! Что и в каком порядке здесь вводится? Вы, как программист, это знаете, потому что читали условие задачи и видели исходный код программы. А что должен думать человек, которому Вы предоставили только экзешник?
Внесите исправление в свой код.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
14.01.2010, 18:09
общий
Колесников Иван Владимирович:
Цитата: 230753
А что кроме Turbo Pascal и Object Pascal (Delphi) можно использовать?

FreePascal.
В отличие от ТР он современен и рассчитан именно на ту ОС, где будет использоваться программа. А в отличие от Delphi он не позволяет программисту быть вором. Увы, в подавляющем большинстве случаев у Delphi отсутствует купленная лицензия. FreePascal позволяет программировать не заморачиваясь на деньги.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
14.01.2010, 18:12
общий
Я забыл про FreePascal)))) Конечно же еще и он! Полностью с вам согласен.
Но все же в учебных заведениях ученики чаще всего изучают Turbo Pascal...
давно
Мастер-Эксперт
425
4118
14.01.2010, 18:19
общий
Колесников Иван Владимирович:
Цитата: 230753
Но все же в учебных заведениях ученики чаще всего изучают Turbo Pascal...

Сегодня Вы можете повлиять на учебные заведения как раз через такие вопросы в пользу FreePascal, явно упоминая его при ответе. Иначе так и будем плестись в корме у индийцев в программировании.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Старший Модератор
31795
6196
14.01.2010, 18:25
общий
Колесников Иван Владимирович:
Цитата: 230753
Но все же в учебных заведениях ученики чаще всего изучают Turbo Pascal...


Ага.
Пройдитесь по архиву рассылки там ещё у школьников встречается PascalАВС.
Цитата: Материал из Википедии
Pascal ABC и PascalABC.NET всех версий является бесплатным (freeware) программным обеспечением.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
14.01.2010, 20:38
общий
Спасибо уважаемые эксперты, за помощь в решении задачки. Вы правы я учусь в ВУЗе на первом курсе, с паскалем раньше никогда не сталкивался поэтому трудновато пока понять его, тем более учусь на дистанционной форме обучения, т.е. лекций по предметам у нас нет, самообучение.
К стати пользуюсь я FreePascal.
И все таки чей ответ мне взять за основу? какой более правельный?
С уважением Андрей
давно
Мастер-Эксперт
425
4118
15.01.2010, 07:48
общий
Верещака Андерй Павлович:
Цитата: 316285
И все таки чей ответ мне взять за основу? какой более правельный?

Любой из ответов решают поставленную задачу. Единственная претензия только к ответу эксперта Колесников Иван Владимирович, т.к.там после запуска программы совершенно неясно в какой последовательности и какие данные нужно вводить. Ввод данных там надо переделать по типу, как это сделано в ответе эксперта amnick.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
15.01.2010, 09:06
общий
Вырожаю благодарность всем участникам форума, вы мне очень помогли. И чтоб никому не было обидно, экспертам Колесникову Ивану Владимировичу, amnick и Disasm, каждому из них говорю спасибо на 30 руб. :-)
Неизвестный
15.01.2010, 16:19
общий
если кого обидел пишите в форум или в личку
Форма ответа