Jump to content
PlayMa256

funcao soma estilo excel.

Recommended Posts

PlayMa256

bom, estou tentando fazer algo do tipo do excel, eu consigo fazer o referenciamento das celulas direitinho, mas aparentemente o problema esta na minha funcao, e realmente nao sei o que fazer....

int calcula(char vetor[]){
   int i;
   if ((strchr(vetor,'+') != NULL) || (strchr(vetor,'-')) != NULL){
	    //variaveis necessarias pra soma, que pega as partes de traz e da frente dos +
	    //depois no final retorno a soma de todas elas.
	    int auxSoma1 = 0;
	    int auxSoma2 = 0;
	    int auxSub1  = 0;
	    int auxSub2  = 0;
	    int aux;
	    //variaveis dos resultados
	    int resSoma = 0;
	    int resSub  = 0;
    for(i=0;i<strlen(vetor);i++){
	   if(vetor[i] == '+'){
		    //Variavel auxiliar pra percorrer da posição do + até o
		    aux = i-1;
		    while((vetor[aux] >= '0') && (vetor[aux] <= '9')){
			    auxSoma1 += atoi(&vetor[aux]);// * (pow(10, i-aux+1));
			    aux--;
		    }
		    //Aux passa a ser i+1 pq, pq ele quer da posição do + até o começo do proximo +
		    aux = i+1;
		    //só percorro se for numeros
		    while((vetor[aux] >= '0') && (vetor[aux] <= '9')){
			    //taco no Soma 2, a soma do que ta na frente
			    // pow de 1-aux-1, pra poder multiplicar, por exemplo de 51, ele acha o 1, depois acha o 5
			    //multiplica por 10 o 5, e depois soma ao 1....
			    auxSoma2 += atoi(&vetor[aux]); //* (pow(10, i-aux-1));
			    aux++;
		    }

		    //Volta o resultado da soma
		    resSoma = auxSoma2 + auxSoma1;
	    }

	    if(vetor[i] == '-'){
		    //Variavel auxiliar pra percorrer da posição do - até o proximo
		    aux = i-1;
		    while((vetor[aux] >= '0') && (vetor[aux] <= '9')){
			    auxSub1 += atoi(&vetor[aux]);
			    aux--;
		    }
		    //Aux passa a ser i+1 pq, pq ele quer da posição do + até o começo do proximo +
		    aux = i+1;
		    //só percorro se for numeros
		    while((vetor[aux] >= '0') && (vetor[aux] <= '9')){
			    //taco no Soma 2, a soma do que ta na frente
			    // pow de 1-aux-1, pra poder multiplicar, por exemplo de 51, ele acha o 1, depois acha o 5
			    //multiplica por 10 o 5, e depois soma ao 1....
			    auxSub2 += atoi(&vetor[aux]);
			    aux++;
		    }
		    resSub = auxSub1-auxSub2;


	    }//laço do if -
    }//laço do for
	 return resSoma+resSub;

   }
   else{
    //Retorna o numero que esta no vetor sem =
    return atoi(vetor+1);
   }

}//laço da funcao

Testei isso isoladamente, e daria, mas...com meu sistema aparentemente nao...

Eu faço o reconhecimento da matriz, faço a alocação para cada celula, faço a reposição de todas as referencias pelos valores correspondentes, mas na hora de se fazer a soma (obs: ainda tenho que fazer a subtração, divisao e multiplicacao, mas com a soma metade dos meus problemas se vao) ele pega valores aleatorios.

Gostaria de saber o problema dessa minha funcao.

Obrigado.

Obs: eu recebo como parametro, o vetor que esta em cada linha da minha matriz.

Obrigado.

Share this post


Link to post
Share on other sites
HappyHippyHippo
double calcula(string, tamanho_string)
 se não encontrar um operador
   retornar valor(string)
 se sim
   string_esq = determinar string à esquerda do operador
   string_dir = determinar string à direita do operador
   retorna operação(operador, calcula(string_esq, tamanho_string_esq), calcula(string_dir, tamanho_string_dir))


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PlayMa256

desta maneira?

for(i=0;i<strlen(vetor);i++){
if(vetor[i] != '+'){
	return vetor;

}else{
	int esquerda = vetor[i-1];
	int direita  = vetor[i+1];
	return (operacao(char op, calcula(esquerda), calcula(direita)));
}
}

em vez de se chamar uma funcao externa, nao poderia simplesmente dar um return esquerda + direita ?

para eu descobrir e pegar a string anterior e posterior ao i(posicao do +), necessito achar a posicao que ele se encontra, e tirar do inicio até a posicao dele, pra achar de onde vai a string, até onde esta o +?

obrigado.

Edited by PlayMa256

Share this post


Link to post
Share on other sites
PlayMa256

ta dando problema de retornar uma void...

warning: control reaches end of non-void function

int calcula(char vetor[]){
int i;
if(strchr(vetor, '+')!= NULL){
	for(i=0;i<strlen(vetor);i++){
		if(vetor[i] != '+'){
			return atoi(vetor);
		}else{
			int esquerda = vetor[i-1];
			int direita = vetor[i+1];
			int resultado = esquerda+direita;
			return resultado;
		}
	}
}else{
	return atoi(vetor);
}
}//laço da funcao

havia feito só da maneira que eu postei, mas mesmo assim, ele continuava dando esse erro.

Edited by PlayMa256

Share this post


Link to post
Share on other sites
bioshock

Tu não queres retornar o vector, tu queres retornar uma posição do vector.

Edited by bioshock

Share this post


Link to post
Share on other sites
PlayMa256

mas pra que motivo eu retornaria a posicao? isso que nao estou entendendo...

verifico se existe um +
  se existir entao começo a identificar
  o que tem a direita
  o que tem a esquerda
  retorno a soma de direita+esquerda
se nao existir um +
retorno o proprio vetor.

Nao seria isso?

e quanto ao warning?

Edited by PlayMa256

Share this post


Link to post
Share on other sites
PlayMa256

Realmente, só que vários sites dizem ora se usar atoi....

Vários diziam pra usar strtol mas li a documentação e infelizmente não consegui entender...

Alguém poderiw explicar ou fazer um exemplo? Nem que seja com outra função..

Obrigado

Realmente, só que vários sites dizem ora se usar atoi....

Vários diziam pra usar strtol mas li a documentação e infelizmente não consegui entender...

Alguém poderiw explicar ou fazer um exemplo? Nem que seja com outra função..

Obrigado

########edit######

Pensando aqui, será que sprintf funcionaria?

Edited by PlayMa256

Share this post


Link to post
Share on other sites
bioshock

Experimentaste a solução do 1º link?

int var;
var = atoi(vetor);
return var;

Share this post


Link to post
Share on other sites
HappyHippyHippo

o sscanf funciona perfeitamente:

char vector[100];
int posicao, valor;

// ...

sscanf(&vector[posicao], "%d", valor);


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.