Ir ao conteúdo

Problemas com expressões matemáticas em C


FabioMonteiro

Posts recomendados

Postado

Olá pessoal, estou com problema em um código onde preciso fazer alguns cálculos para exibir para o usuário. Uma breve explicação sobre o programa: Ele escolhe aleatoriamente entre alguns valores de resistencia, tensão e o tipo de circuito e atribui a uma tabela (matriz). Há um menu onde o usuario escolhe a opção de calcular alguns valores, de cada linha da matriz, que contem valores aleatórios para os calculo.

Até aí tudo bem, o programa estava indo bem, mas quando fui começar a parte dos calculo, começou a dor de cabeça. Eu criei a uma função que recebe como parâmetro um vetor auxiliar com a linha correspondente da matriz a ser calculada. O que acontece é que quando eu vou rodar o programa ele nem faz nada e aparece uma mensagem do windows dizendo que o programa parou de funcionar e precisa ser fechado, mas o compilador nao acusa erro algum. Bom vou passar o trecho do codigo pra vocês, apenas a função onde esta o problema. Desculpem se o codigo é um pouco tosco mas estou aprendendo, sou estudante do 2° semestre de engenharia Elétrica.

void calculo1(int vet[])
{
float rtotal, voltimetro, amperimetro, ampstotal, potenciaR2,i;
rtotal=vet[0]+(1/((1/vet[1])+(1/vet[2])))+vet[3];//Resistencia total do circuito
ampstotal=vet[4]/rtotal;//Corrente total no circuito
voltimetro=vet[0]*ampstotal;//Tensão no voltimetro;
amperimetro=(1/((1/vet[1])+(1/vet[2])))*ampstotal/vet[2];//Corrente no amperimetro
i=(1/((1/vet[1])+(1/vet[2])))*ampstotal/vet[1];//Corrente no R2 para simplificar o calculo da potencia dissipada
potenciaR2=vet[1]*i*i;//Potencia dissipada em R2
printf("Valores utilizados no circuito: R1= %i ohms, R2= %i ohms, R3= %i ohms, R4= %i ohms, Tensão %iV.",vet[0],vet[1],vet[2],vet[3],vet[4]);
printf("\nTipo do circuito: circuito N° %i", vet[5]);
printf("\nResistencia total do circuito: %.2f Ohms\n", rtotal);
printf("\nTensão no Voltimetro: %.2f volts\n", voltimetro);
printf("\nCorrente no Amperímetro: %.2f ampéres\n",amperimetro);
printf("\nPotência dissipada em R2: %.2f watts\n", potenciaR2);
printf("\nCorrente total no circuito: %.2f ampéres\n", ampstotal);
}

Obrigado, espero que consigam me ajudar!

Postado

Testei o seguinte programa e funcionou corretamente.

#include <stdio.h>

void calculo1(int n[])
{
float rtotal, voltimetro, amperimetro, ampstotal, potenciaR2, i;
float vet[ sizeof n / sizeof n[0] ];
int k, m = sizeof n / sizeof n[0];

for( k = 0; k < m; ++k )
vet[k] = (float)n[k];
rtotal=vet[0]+(1/((1/vet[1])+(1/vet[2])))+vet[3];//Resistencia total do circuito
ampstotal=vet[4]/rtotal;//Corrente total no circuito
voltimetro=vet[0]*ampstotal;//Tensão no voltimetro;
amperimetro=(1/((1/vet[1])+(1/vet[2])))*ampstotal/vet[2];//Corrente no amperimetro
i=(1/((1/vet[1])+(1/vet[2])))*ampstotal/vet[1];//Corrente no R2 para simplificar o calculoda potencia dissipada
potenciaR2=vet[1]*i*i;//Potencia dissipada em R2
printf("Valores utilizados no circuito: R1= %i ohms, R2= %i ohms, R3= %i ohms, R4= %i ohms, Tensão %iV.",n[0],n[1],n[2],n[3],n[4]);
printf("\nTipo do circuito: circuito N° %i", n[5]);
printf("\nResistencia total do circuito: %.2f Ohms\n", rtotal);
printf("\nTensão no Voltimetro: %.2f volts\n", voltimetro);
printf("\nCorrente no Amperímetro: %.2f ampéres\n",amperimetro);
printf("\nPotência dissipada em R2: %.2f watts\n", potenciaR2);
printf("\nCorrente total no circuito: %.2f ampéres\n", ampstotal);
}

int main(void) {
int a[6] = { 1, 2, 3, 4, 5, 6 };
calculo1( a );
return 0;
}

O problema era que você estava dividindo (1/vet[k]), numa divisão inteira, resultando em 0, no caso de vet[k] ser maior que 1. Assim, estavam sendo realizadas divisões por zero, resultando em erro de execução.

Postado

Obrigado pela resposta! Já consegui resolver o meu problema, e melhorei um pouco o código também. O erro era bem simples mesmo, mas eu pensei que como um dos operandos era float, os outros se convertiam automaticamente a float também.

Postado

Nenhum dos operandos da divisão era do tipo float, na primeira divisão. Você estava armazenando o resultado numa variável deste tipo, mas os operandos eram inteiros. Caso os operandos realmente fossem do tipo float (pelo menos um deles), o resultado seria ponto flutuante.

No caso de operadores inteiros, a divisão inteira é tomada como padrão.

# Edit

Uma forma mais simples de corrigir:

void calculo1(int vet[]) {
float rtotal, voltimetro, amperimetro, ampstotal, potenciaR2,i;
rtotal=vet[0]+(1./((1./vet[1])+(1./vet[2])))+vet[3];//Resistencia total do circuito
ampstotal=vet[4]/rtotal;//Corrente total no circuito voltimetro=vet[0]*ampstotal;//Tensão no voltimetro;
amperimetro=(1./((1./vet[1])+(1./vet[2])))*ampstotal/vet[2];//Corrente no amperimetro
i=(1./((1./vet[1])+(1./vet[2])))*ampstotal/vet[1];//Corrente no R2 para simplificar o calculo da potencia dissipada
potenciaR2=vet[1]*i*i;//Potencia dissipada em R2
printf("Valores utilizados no circuito: R1= %i ohms, R2= %i ohms, R3= %i ohms, R4= %i ohms, Tensão %iV.",vet[0],vet[1],vet[2],vet[3],vet[4]);
printf("\nTipo do circuito: circuito N° %i", vet[5]);
printf("\nResistencia total do circuito: %.2f Ohms\n", rtotal);
printf("\nTensão no Voltimetro: %.2f volts\n", voltimetro);
printf("\nCorrente no Amperímetro: %.2f ampéres\n",amperimetro);
printf("\nPotência dissipada em R2: %.2f watts\n", potenciaR2);
printf("\nCorrente total no circuito: %.2f ampéres\n", ampstotal);
}

Tente ver o que eu fiz.

Postado

Sim, você colocou o ponto depois do numero um, para indicar ao compilador que aquele era um valor do tipo float. Não havia pensado nisso. Muito obrigado pela ajuda e atenção.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!