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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2012, 13:46   #1
Недознайка
Новичок
Джуниор
 
Регистрация: 28.12.2012
Сообщений: 2
По умолчанию Решить задачу на с++.

Начала самостоятельно изучать с++. Пока еще мои познания где-то в нулевом цикле. Хочу посмотреть на решенную задачу,чтобы понять правильно ли я двигаюсь. Спасибо заранее.

"Даны действительное число a и натуральное число n. Вычислить
а(а-n)(a-2n)...(a-n2).
1. Проанализировать постановку задачи.
2. Обосновать используемые структуры данных и алгоритм решения задачи.
3. Написать и отладить программу для решения задачи."
Недознайка вне форума Ответить с цитированием
Старый 28.12.2012, 14:19   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Даны действительное число a и натуральное число n. Вычислить
а(а+n)(a+4n)(a+9n)...(a+n^3).
1. Проанализировать постановку задачи.
2. Обосновать используемые структуры данных и алгоритм решения задачи.
3. Написать и отладить программу для решения задачи.
По моему мнению, схема чрезмерно тяжеловесна, особенно для начинающего. Here goes...

1) Входные данные: a (вещественное), n (целое неотрицательное). Дополнительные предположения: a представимо типом double, n^3 таково, что результат вычислений с требуемой точностью представим типом double.
Выходные данные: вещественное число S типа double, такое, что, с требуемой точностью, a*(a+n)*...*(a+n^3) = S(a,n).
Выделение вычислимой функции: R(a,n,p)=a*(a+n)*...*(a+p^2*n). S(a,n)=R(a,n,n).
Далее, R(a,n,p) = a*(a+n)*...*(a+(p-1)^2*n)*(a+p^2*n) = R(a,n,p-1)*(a+p^2*n). R(a,n,0)=a. Следовательно, R вычислима. Следовательно, S вычислима.

2) R представима числом типа double. Рекурсивную запись R можно перевести в т.н. "хвостовую рекурсию": R'(a,n,0,acc)=acc, R'(a,n,p,acc)=R'(a,n,p-1,acc*(a+p*p*n)); R(a,n,p)=R'(a,n,p,1). Такое выражение впрямую переводится в цикл с предусловием:
Код:
double acc=1;
while(p!=0) {acc = acc*(a+p*p*n); p = p-1;}
//acc на выходе из цикла - значение R'
Осталось воспользоваться S(a,n)=R(a,n,n)=R'(a,n,n,1) и получить:

3)
Код:
double S(double a, unsigned n){
  unsigned p = n; //S(a,n)=R(a,n,n)
  double acc = 1; //R(a,n,p)=R'(a,n,p,1)
  while(p!=0) { //R'(a,n,0,acc)=acc
    acc = acc*(a+p*p*n); //R'(a,n,p,acc)=R'(a,n,p-1,acc*(a+p*p*n))
    p = p-1;
  }
  return acc; //R'(a,n,0,acc)=acc
}
Окончательно, все манипуляции с p в C++ можно перенести в цикл for, а также заменить вычитание единицы декрементом, а домножение acc выполнять с помощью оператора *=.
Также следует учесть опасность переполнения типа unsigned при перемножении. Для решения проблемы следует "силком" привести p к типу double при домножении acc
Код:
double S(double a, unsigned n){
  double acc = 1;
  for(unsigned p=n; p!=0; --p) {
    acc *= a+(double)(p)*p*n;
  }
  return acc; //S=acc
}

Последний раз редактировалось Abstraction; 28.12.2012 в 14:27.
Abstraction вне форума Ответить с цитированием
Старый 10.01.2013, 20:01   #3
Недознайка
Новичок
Джуниор
 
Регистрация: 28.12.2012
Сообщений: 2
По умолчанию

Спасибо. Поняла одно: я еще совсем не продвинулась от нулевого уровня! Какой учебник считается лучшим? У меня "C/C++. Программирование на языке высокого уровня: Учебник для вузов" Автор(ы): Павловская Т. А. Дайте отзыв, пожалуйста.
Недознайка вне форума Ответить с цитированием
Старый 10.01.2013, 23:30   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Вообще, одна из лучших книжек по С++ для начинающих, существующих в природе - http://www.stroustrup.com/programming.html . Писалась автором языка как раз для людей, которые не программировали раньше.

Ну а все эти недоучебники "для вузов" можешь сразу выбросить.
Son Of Pain вне форума Ответить с цитированием
Старый 10.01.2013, 23:41   #5
Павел_95
Пользователь
 
Регистрация: 04.11.2012
Сообщений: 22
По умолчанию

Посоветовал бы сначала изучить просто язык Си. Он и легче и уже после него будет хорошая основа для С++. Я лично, изучаю в данный момент Си ( ну и когда практикуюсь иногда прибегаю к функциям С++, ибо они бывают удобнее и легче для использования). Многие люди советовали мне сначала изучить Си. Поверьте, лишним уж точно не будет. Лучшей книгой считаю "Язык программирования С(ANSI C)" Б. Керниган, Д. Ритчи. http://books.tr200.ru/v.php?id=9563
Павел_95 вне форума Ответить с цитированием
Старый 10.01.2013, 23:46   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Да, я тоже всем советую начинать с C, и именно с книжки K&R. Но в этой теме задали конкретный вопрос - я на него конкретно отвечаю.
Son Of Pain вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решить задачу Евгений 9 Общие вопросы Delphi 0 23.12.2011 09:33
Решить задачу MrVamp Паскаль, Turbo Pascal, PascalABC.NET 0 14.12.2011 01:29
РЕШИТЬ ЗАДАЧУ В С++ колбаса Помощь студентам 0 23.11.2011 17:07
решить задачу на С++ Лина_Чер Помощь студентам 7 16.06.2011 16:28