Member 11413685 Ответов: 2

Почему эта программа не работает для мощности с отрицательными числами?


Мой код выглядит следующим образом:

Логика кода находится в функции evaluate(). Код работает для номера +ve, но не работает для номера-ve. В чем может быть проблема?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

int evaluate(char p[],int size, int num1);
void read_values();
void calc();
int values[100];
int i,temp,num,j,k,l=0,result=0,temp_position=0,values_size=0;
char p1[100],arr_temp[100],a[100];

int main(){
	scanf("%s",p1);
	read_values();
	calc();
	values[values_size]=evaluate(p1,100, values[values_size]);
	printf("%s\n",p1);
	for(j=0;j<values_size;j++)
	{
		printf("%d\n",values[j]);
	}
	return 0;//end of main
}
void read_values(){	
	do
	{
		scanf("%d",&temp);
		if(temp==1000)
			break;
		else
		{
			values[values_size]=temp;
			values_size++;
		}
	}
	while(values[values_size]!=1000);
}	

void calc(){
	k=0;
	for(l=0;p1[l]!='\0';l++)
	{	
		if((p1[l]=='('))//opening bracket encountered
		{	temp_position=0;
			while(p1[++l]!=')')
			{
				a[temp_position++]=p1[l];
			}
			arr_temp[k++]=evaluate(a,temp_position,values[values_size])+48;
		}
		else 
			arr_temp[k++]=p1[l];//copy directly until opening bracket		
	}
	values[values_size]=evaluate(arr_temp,100, values[values_size]);
	values_size++;
}

int evaluate(char p[],int size, int num1){
	for(i=0;p[i+1]!='\0';i++)
	{
		if(i==0)
		{
			if(p[0]>='a'&&p[0]<='z')
				result = num1;
			else
				result =p[0]-48;
		}
		if (p[i]=='^')
		{
			if(p[i+1]>='a'&&p[i+1]<='z')
				result=pow(result,num1);
			else
				result=pow(result,(p[i+1]-48));
		}
	}
	return result;
}


Что я уже пробовал:

Ввод:
(x-2)^3-(x-3)
-1
1000
----------
Выход:
Должно было быть -23, но я получаю -1.

[no name]

Что должна делать эта масса кода? Это называется Q&A, потому что четкие вопросы дают ответы. Отладка-это совсем другое дело, и вы должны этому научиться.

2 Ответов

Рейтинг:
6

Jochen Arndt

У меня нет окончательного решения, потому что было бы слишком трудно следить за выполнением программы, просто изучая код. Но у меня есть несколько советов:

Не используйте глобальные переменные. Используйте локальные переменные в своих функциях. Это значительно облегчает чтение и отладку кода.

Похоже, что нет никакого кода, который обрабатывает операцию вычитания. Что происходит, когда ваш парсер сталкивается с символом" -"? Он рассматривает его как цифру и вычитает 48, что будет -3!

Вы проходите мимо values[value_size] к вашему evaluate функция, которая используется там как num1. Но этот элемент массива не инициализируется при вызове функции. После этого он будет инициализирован возвращаемым значением. После того как вы присвоили значение элементу массива, вы увеличиваете индекс так, чтобы он указывал на следующий еще не инициализированный элемент.


Рейтинг:
2

Patrice T

Используйте отладчик.
Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

С помощью отладчика убедитесь, что код действительно соответствует тому, что вы думаете.

Попробуйте уменьшить код до уровня, достаточного для демонстрации проблемы.


CPallini

5

Patrice T

Спасибо еще раз.

Member 11413685

5??

CPallini

Я дал ему пять звезд за его предложение: вам действительно нужно использовать отладчик!

Patrice T

Люди, думающие, что решение хорошее или плохое, могут повысить или понизить его.
Смотрите Звезды справа от "решения 1" 1 или 2 звезды-это нисходящий Голос, 4 или 5 звезд-это восходящий голос.