Olá, estou criando um algoritmo que faça a separação de Strings da entrada, no caso, uma equação quadrática. Quero separar o a, b e c. Só que a saída não funciona corretamente.
Segue o código:
#include<stdio.h>#include<stdlib.h>intmain(){charequacao[20];inti=0;inta,b,c;printf("Entre com a equação: ");scanf("%19[^\n]",equacao);for(i=0;i<20;i++){if(equacao[i]=='x'&&equacao[i + 1]=='²'){//a=equacao[i - 1];a=atoi(&equacao[i - 1]);}if(equacao[i]=='x'&&equacao[i + 1]!='²'){//b=equacao[i - 1];b=atoi(&equacao[i - 1]);}if(equacao[i]==' '){//c=equacao[i - 1];b=atoi(&equacao[i - 1]);}}for(i=0;i<20;i++){printf("campo %d: %c\n",i,equacao[i]);}printf("O valor de a: %d\n",a);printf("O valor de b: %d\n",b);printf("O valor de c: %d\n",c);}
É necessário que eu converta em inteiro, pois assim que conseguir corrigir este código pretendo usar as variáveis para efetuar cálculos.
Retire o &, pois assim você pegaria o endereço do caracter, não seu valor.
Se você está lidando com números de um único dígito, é mais fácil subtrair o char ‘0’ do que usar atoi:
Ou seja, ao invés disso:
usar isso:
R
robferlima
Bom, fiz as alterações no código. Só que ainda não funciona, não consegui a saída desejada. Os coeficientes não são os mesmo, com exceção do b, que fica certo.
#include<stdio.h>#include<stdlib.h>intmain(){charequacao[20];inti=0;inta,b,c;printf("Entre com a equação: ");scanf("%19[^\n]",equacao);for(i=0;i<20;i++){if(equacao[i]=='x'&&equacao[i + 1]=='²'){//a=equacao[i - 1];//a=atoi(&equacao[i - 1]);a=(int)(equacao[i-1]-'0');}if(equacao[i]=='x'&&equacao[i + 1]!='²'){//b=equacao[i - 1];//b=atoi(&equacao[i - 1]);b=(int)(equacao[i-1]-'0');}if(equacao[i]==' '){//c=equacao[i - 1];//b=atoi(&equacao[i - 1]);c=(int)(equacao[i-1]-'0');}}printf("O valor de a: %d\n",a);printf("O valor de b: %d\n",b);printf("O valor de c: %d\n",c);}
Entrada: 4x² + 2x + 5 = 0
Saída:
O valor de a: 3
O valor de b: 2
O valor de c: 13
ViniGodoy
Tente rodar o programa passo-a-passo com o depurador.
É a forma mais fácil de ver o que está acontecendo.
Que IDE você está usando? Visual Studio? Code::Blocks? QT Creator?
(Por favor, não diga que é DevCpp).
JuniorMaia
Vini, já usei muito do Dev C++ e gostei, algo contra ele? É pior que o Code blocks?
ViniGodoy
Sim, muita coisa contra ele:
É pré-histórico. Recomendar DevCpp hoje em dia é o mesmo que recomendar Eclipse 1.1;
Vem com uma versão antiga do compilador MinGW (seria como programar em Java 1.2);
Tem alguns bugs bastante chatos, como omitir parte das mensagens de erro;
Existem alternativas muito melhores no mercado, igualmente gratuitas, igualmente leves e ainda multiplataforma e integradas com depurador.
gomesrod
Os coeficientes B e C funcionam, mas para que encontre o C é preciso colocar um espaço no final da expressão (é o que o if procura).
Quanto ao A, não está funcionando porque a comparação equacao[i + 1] == ‘²’ sempre retorna false. Para comprovar, coloque algumas mensagens de debug quando entra em cada IF ([color=red]printf(“Achou A”)[/color], [color=blue]printf(“Achou B”)[/color], [color=green]printf(“Achou C”)[/color]) vc vai ver que ele entra no “Achou B” duas vezes, e nenhuma no A.
O motivo eu ainda não sei, mas pelo menos vc já tem um ponto de partida para investigar.
R
robferlima
Aí gente, obrigado pela contribuição de vocês. Efetuei algumas modificações e agora estão funcionando.
Mas o problema é que na ausencia de algum coeficiente ele não detecta como zero.
Por exemplo: 2x² + 9 = 0
deveria aparecer
a=2
b=0
c = 9
Eis a ultima versão do código:
#include<stdio.h>#include<stdlib.h>intmain(){charequacao[20];inti=0;inta,b,c,teste=0;printf("Entre com a equação: ");scanf("%19[^\n]",equacao);for(i=0;i<20;i++){if(equacao[i]=='x'&&equacao[i + 1]!=' '){//a=equacao[i - 1];//a=atoi(&equacao[i - 1]);a=(int)(equacao[i-1]-'0');}if(equacao[i]=='x'&&equacao[i + 1]!='²'){//b=equacao[i - 1];//b=atoi(&equacao[i - 1]);b=(int)(equacao[i-1]-'0');teste=1;}if(equacao[i + 2]=='='&&teste==1){//c=equacao[i - 1];//b=atoi(&equacao[i - 1]);c=(int)(equacao[i]-'0');teste=0;}}printf("O valor de a: %d\n",a);printf("O valor de b: %d\n",b);printf("O valor de c: %d\n",c);}