Показать сообщение отдельно

  #2153  
Старый 03.01.2010, 18:47
n1ghtstalker
Познающий
Регистрация: 28.09.2008
Сообщений: 65
Провел на форуме:
152084

Репутация: 8
По умолчанию

Цитата:
Сообщение от DJeFRY_RASH  
Ребята не могли бы вы помочь с прогой, вся прога написана, всё сделано правильно, работает, но заминка в том, что уравнение для расчёта неправильное !
Код:
program xyz;

uses
  SysUtils,
  Windows;

label
  EnterN;

var
  N, i, z   : Integer;
  ans      : Char;



//------------------------------------------------------------------------------
function Ru(str: String): String;         // Функция перевода получаемой строки из ANSI-кодировки в OEM-кодировку DOS.
begin                                     // Начало функции.
  Result := '';                           // Обнуляем результат.
  if Length(str) > 0 then                 // Если получена непустая строка, то
  begin                                   // выполняем код:
    SetLength(Result, Length(str));       // Устанавливаем размер для строки результата.
    CharToOem(PChar(str), PChar(Result)); // Конвертируем строку в OEM-формат (модуль 'Windows.pas').
  end;                                    // Результирующая строка уже в новой кодировке.
end;                                      // Конец функции.



//------------------------------------------------------------------------------
begin
  WriteLn(Ru('Программа для вычисления факториала нечётных чисел:'));         // Вывод информации на экран о назначении программы.
  WriteLn('');
  WriteLn('   N!!! = 1 x 3 x 5 ... x N   ');
  WriteLn('');
  WriteLn(Ru('Выполнил ...'));              // Вывод информации на экран об авторе программы.
  WriteLn('');
  Writeln('...');
  EnterN:                                                                     // Возврат в это место при ошибке или при повторном вводе данных.
    WriteLn('');                                                              // ...
    Write(Ru('Введите нечётное число N, где N > 1 : '));                                     // ...
    ReadLn(N);                                                                // Ввод числа Х.
    if (N <= 1) or (N mod 2=0) then                                                          // Если Х меньше или равен 1, то
    begin                                                                     // выполнить код:
      WriteLn(Ru('Произошла ошибка при вводе, попробуйте ещё раз.'));         // - вывести сообщение об ошибке;
      GoTo EnterN;                                                            // - вернуться к началу;
    end;                                                                      // ...
  WriteLn('');                                                                // ...
  z := 1;                                                                     // Обнуляем переменную результата.
  for i := 1 to N do z := z*(i*2-1);                                          // Увеличиваем переменную результата N раз.
  WriteLn(Ru('Полученный результат: '+IntToStr(z)));                          // Отправить Х на обработку в функцию 'Formula()' и вывести результат.
  WriteLn('');                                                                // ...
  Write(Ru('Вы хотите продолжить работу с программой? (Y/N) : '));            // Предложить продолжить работу с программой.
  ReadLn(ans);                                                                // Получить согласие.
  if (ans='Y') or (ans='y') or (ans=Ru('Н')) or (ans=Ru('н')) then GoTo EnterN; // Если согласие получено - возврат к началу.
end.
Когда запускаешь прогу, просит ввести N, если вводим 5, то получаем такой факториал 1х3х5х7х9, а нужно чтобы 5 была последней цифрой в этом подсчёте, то есть 1х3х5.
Перепробовал многие варианты, не выходит. кто может разобраться, помогите !

в цикле организуй проверку до вычисления факториала.
те

for i := 1 to N do
begin
if i mod 2 <> 0 then
z := z*i;
end;

ну и формулу чуть подредактировал. а то я не уловил зачем было i*2-1
вот в приципе и всё.
 
Ответить с цитированием