Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2010, 14:30   #1
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию Преобразование программы в функцию

У Дейтлов есть задача:
Цитата:
После того, как вы определили, что делает программа в упражнении 3.50, преобразуй-
те программу в соответствующую функцию, удалив ограничение, требующее, чтобы
второй аргумент был неотрицательным.
Код из упр. 3.50 такой:

Код:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

int mystery (int, int);

int main()
{
   int x, y;
   cout << "Введите два целых числа: ";
   cin >> x >> y;
   cout << "Результат: " << mystery( x, y ) << endl;
   return 0;
}

// Параметр Ь должен быть положительным
// целым для предотвращения бесконечной рекурсии
int mystery (int a, int b )
{
   if ( b = 1 )
      return a;
   else
      return a + mystery( a, b - 1 );
}
Я его переделал в
Код:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<windows>

int mystery(int, int);
int mystery2(int, int);

int main()
{
   int x, y;

   mystery2(x, y);

   system("pause");
   return 0;
}

// Параметр b должен быть положительным
// целым для предотвращения бесконечной рекурсии
int mystery (int a, int b )
{
   if ( b = 1 )
      return a;
   else
      return a + mystery(a, b - 1 ) ;
}

int mystery2 (int c, int d)
{
   cout <<"Vvedite dva celih chisla: ";
   cin >> c >> d;
   cout << "Resultat: " << mystery( c, d ) << endl;
}
Как считаете, я справился с поставленной задачей?
fs444 вне форума Ответить с цитированием
Старый 28.03.2010, 15:28   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

fs444
нет.
Код:
int x, y;
   mystery2(x, y);
переменные не инициализировал,но уже передаешь в функцию
функция mystery2 возвращает int но в ней нет return
второй аргумент по прежнему не может быть отрицательным или равным 0. Чтобы происходил выход при отрицательном второй агрумента возможно надо заменить b=1 на b<=1
rrrFer вне форума Ответить с цитированием
Старый 28.03.2010, 15:28   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

#include<windows> // эта строчка тебе зачем?
rrrFer вне форума Ответить с цитированием
Старый 29.03.2010, 18:25   #4
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

rrrFer, мда, пойду делать =))

Цитата:
#include<windows> // эта строчка тебе зачем?
чтобы работала команда
Код:
system("pause");
fs444 вне форума Ответить с цитированием
Старый 29.03.2010, 21:25   #5
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Еще ошибка
Цитата:
if ( b = 1 )
Рекурсии не будет.
Что касается задания прога должна сложить "а" "b" раз.
Чтобы "b" могло быть и отрицательным его нужно брать по абсолютному значению, либо проверять, если отрицательное то запускать рекурсию со знаком плюс (делать еще одну функцию)
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол

Последний раз редактировалось atenon; 29.03.2010 в 21:28.
atenon вне форума Ответить с цитированием
Старый 30.03.2010, 16:13   #6
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

Сделал так:
Код:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

#include<windows>

int mystery(int, int);
int mystery2(int, int);

int main()
{
   int x, y;

   mystery2(x, y);

   system("pause");
   return 0;
}

// Параметр b должен быть положительным
// целым для предотвращения бесконечной рекурсии
int mystery (int a, int b )
{
   if (b >= 0)
   {
      if ( b = 1 )
         return a;
      else
         return a + mystery(a, b - 1 ) ;
   }
   else
   {
      if ( b = 1 )
         return a;
      else
         return a + mystery(a, b + 1 ) ;
   }

}

int mystery2 (int c, int d)
{
   cout <<"Vvedite dva celih chisla: ";
   cin >> c >> d;
   cout << "Resultat: " << mystery( c, d ) << endl;
}
Правильно?
fs444 вне форума Ответить с цитированием
Старый 30.03.2010, 18:06   #7
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Цитата:
int mystery2 (int c, int d)
{
cout <<"Vvedite dva celih chisla: ";
cin >> c >> d;
cout << "Resultat: " << mystery( c, d ) << endl;
}
Функцие передаются не инициализированные параметры, также она не не возращает значения (void) (Кстати на фиг она нужна?)

Цитата:
if ( b = 1 )
Переменной b присваевается 1 и сразу функция возращает а.
Нужно исправить на if ( b == 1 )

Цитата:
else
{
if ( b = =1 )
return a;
else
return a + mystery(a, b + 1 ) ;
}
В этой части программы при отрицательном "b", число "а" будет складываться не "b" раз, а "b+2" раза.
Здесь if ( b == 1 ) Нужно заменить +1 на -1 .
Цитата:
if (b >= 0)
По условию рекурсии "b" никак не может быть равным нулю.
Я бы лучше создал ДВЕ рекурсивные функции одна для положительного "b" другая для отрицательного.

Код:
int main()
{
 int x, y, k;

	cout <<"Vvedite dva celih chisla: ";
	cin >> x >> y;

	if (y>0)
		k=mystery1 (x, y);
	else
		k=mystery2(x, y);

	cout<<"Itog  "<<k<<"\n";
   return 0;
}


int mystery1 (int a, int b )
{
      if ( b == 1 )
         return a;
      else
         return a + mystery1(a, b - 1 ) ;
}
int mystery2 (int a, int b )
{
      if ( b == -1 )
         return a;
      else
         return a + mystery2(a, b + 1 ) ;
}
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол

Последний раз редактировалось atenon; 30.03.2010 в 18:24.
atenon вне форума Ответить с цитированием
Старый 04.04.2010, 13:29   #8
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

Цитата:
Функцие передаются не инициализированные параметры
Почему не инициализированные? Я же написал:
Код:
   int x, y;

   mystery2(x, y);
Цитата:
также она не не возращает значения (void)
спасибо, поправил.

Цитата:
Кстати на фиг она нужна?
Что именно ты имеешь в виду?

Цитата:
Нужно исправить на if ( b == 1 )
Поправил.

Цитата:
Код:
else
{
if ( b = =1 )
return a;
else
return a + mystery(a, b + 1 ) ;
}
В этой части программы при отрицательном "b", число "а" будет складываться не "b" раз, а "b+2" раза.
Почему "b+2"? b ведь каждый раз на 1 уменьшается, потому что оно отрицательное.

Цитата:
Здесь if ( b == 1 ) Нужно заменить +1 на -1 .
Не совсем понял, о чем ты здесь?

Цитата:
По условию рекурсии "b" никак не может быть равным нулю.
Я бы лучше создал ДВЕ рекурсивные функции одна для положительного "b" другая для отрицательного.
Согласен.

А у тебя после выполнения программы консоль сама не закрывается? А то мне вот в твой код приходится system("pause") добавлять.
fs444 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование текста программы в RTF Kostj@n Общие вопросы Delphi 3 27.12.2011 11:44
Преобразование в С++ Davlet M Помощь студентам 3 03.10.2009 14:30
Преобразование программы DiMoN2002 Общие вопросы C/C++ 5 28.04.2009 18:31
преобразование программы Ananim-Pbl6ak Помощь студентам 1 02.04.2009 22:37