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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2010, 19:44   #1
KING_t.r.b.e.
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 10
По умолчанию Функция возведения в степень

Написал программу для возведения числа в степень, которая использует собственноручно написанную функцию возведения в степень. Но при возведении в нулевую или отрицательную степень вылетает ошибка
В чем ошибка?
Код:
#include <stdio.h>
double pow(double, int);
void main()
{
	double a, x;
	int i;
	while (1)
	{
		printf ("vvedite osnovanie chisla:\n");
		scanf ("%lf", &a);
		printf ("vvedite pokazatel:\n");
		scanf ("%ld", &i);
		x=pow(a,i);
		printf ("otvet: %lf\n",x);
		if (i==1)
			break;
	}
}
/* Функция возведения в степень */
double pow(double a, int i)
{
	double x;
	int m;
		if (i>0)
		{
			x=a;
			if (i==1)
			x=a;
			else
				for (m=1; m<i; m++)
					x*=a;
		}
		if (i=0)
			x=1;
		if (i<0)
		{
			x=a;
			if (i==-1)
				x=1/x;
			else
				for (m=-1; m>i; m--)
					x*=a;
		}
		return x;
}
KING_t.r.b.e. вне форума Ответить с цитированием
Старый 23.11.2010, 19:59   #2
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Цитата:
Код:
if (i=0)	x=1;
Здесь i присваивается 0, x не изменяется, и в итоге результат не определен. Спутано сравнение с присваиванием
sergey.d вне форума Ответить с цитированием
Старый 23.11.2010, 20:01   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Во-первых,
Код:
if (i == 0)
Во-вторых, лучше сделайте примерно так:
Код:
double Pow(double a, int i)
{
double x = 1;
int m = abs(i);
while (m > 0)
 {
 x *= a;
 m--;
 }
if (i < 0)
 x = 1/x;
return x;
}
Случай с i == 0 становится частным случаем, и
a^(-abs(i)) == 1 / (a^(abs(i)))
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 23.11.2010, 20:05   #4
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Код:
#include <iostream>

double Pow(double x, int y)
{
    if(y > 0) return x * Pow(x, y - 1);
    if(y == 0) return 1.0;
    return 1.0 / Pow(x, -y);
}

int main(int, char *[])
{
    std::cout << Pow(-3.0, -3) << std::endl;
    std::cout << Pow(-3.0, 0) << std::endl;
    std::cout << Pow(-3.0, 5) << std::endl;
    return 0;
}
А вообще, с использованием рекурсии все выглядит куда красивее Код можно еще сократить:

Код:
double Pow(double x, int y)
{
    return y > 0 ? x * Pow(x, y - 1) : !y ? 1.0 : 1.0 / Pow(x, -y);
}

Последний раз редактировалось sergey.d; 23.11.2010 в 20:21.
sergey.d вне форума Ответить с цитированием
Старый 23.11.2010, 20:20   #5
KING_t.r.b.e.
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 10
По умолчанию

Всем спасибо за помощь! Исправил, все работает)))
Код:
#include <stdio.h>
double pow(double, int);
void main()
{
	double a, x;
	int i;
	while (1)
	{
		printf ("vvedite osnovanie chisla:\n");
		scanf ("%lf", &a);
		printf ("vvedite pokazatel:\n");
		scanf ("%ld", &i);
		x=pow(a,i);
		printf ("otvet: %lf\n",x);
		if (i==1)
			break;
	}
}
/* Функция возведения в степень */
double pow(double a, int i)
{
	double x;
	int m;
		if (i>0)
		{
			x=a;
			if (i==1)
			x=a;
			else
				for (m=1; m<i; m++)
					x*=a;
		}
		if (i==0)
			x=1;
		if (i<0)
		{
			x=a;
			if (i==-1)
				x=1/x;
			else
				for (m=-1; m>i; m--)
				{
					x*=a;
					x=1/x;
				}
		}
		return x;
}
Математические функции запрещено использовать по заданию. И рекурсию мы еще не изучали...
KING_t.r.b.e. вне форума Ответить с цитированием
Старый 23.11.2010, 20:37   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Точно работает??
Код:
for (m=-1; m>i; m--)
{
	x*=a;
	x=1/x;
}
Если i == -3, a == 2 то получим:
1) m == -1, x = 2 * 2 = 4, x = 1/4
2) m == -2, x = 1/4 * 2 = 1/2, x = 2
Очень странный алгоритм и результат, не находите.
А в моем варианте вместо
Код:
m = abs(i);
можно написать
Код:
if (i < 0)
 m = -i;
else
 m = i;
или тернарной инструкцией:
Код:
m = (i < 0) ? -i : i;
И в коде меньше всяких вариантов, и нагляднее, и менее заморочено.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 24.11.2010, 15:37   #7
KING_t.r.b.e.
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 10
По умолчанию

оуу...
спасибо))
поспешишь людей насмешишь...
KING_t.r.b.e. вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл, возведения числа в N-ную степень Marmelade Общие вопросы C/C++ 34 22.10.2010 17:03
C# ф-я возведения вещ числа в целую степень без include<math.h> Mitya999 Помощь студентам 5 14.12.2009 16:30
Забыл африфметическую операцию для возведения в N'ую степень pro100-delphi Паскаль, Turbo Pascal, PascalABC.NET 5 21.08.2009 16:18
степень bbk_serg Помощь студентам 3 01.02.2009 18:43
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50