Ir ao conteúdo

erro logico em algoritmo em C


carlosd

Posts recomendados

Postado

eu fiz um algoritmo em C que dado dois numeros, e a operação aritmetica dada, ele calcula, o algoritmo feito:

#include<stdio.h>

int main(void)

{

int A,B;

char opcao;

float valor;

printf("escreva valor de A:");

scanf("%d",&A);

printf("escreva valor de B:");

scanf("%d",&B);

printf(" escreva seu simbolo(+,-,*,/)");

scanf("%s",&opcao);

if(opcao=='+'){//inicio do então a

valor=A+B;

printf(" o valor da soma é:%.1f",valor);

}//fim do então a

else{//começo do senao a

if(opcao=='-'){//começo do então b

valor=A-B;

printf("a subtração é:%.1f",valor);

}//fim do então b

else{//começo do senao b

if(opcao=='*'){//começo do então c

valor=A*B;

printf("a multiplicação é:%.2f",valor);

}//fim do então c

else{//começo do senao c

if(opcao=='/'){//começo do então d

valor=(float)A/B;

printf("a divisão é:%.2f",valor);

}//fim do então d

}//fim do senao c

}//fim do senao b

}//fim do senao a

}

mais quando calcular por exemplo, 12-11, ele da 12 :blink: , o que pode estar acontecendo?

  • Membro VIP
Postado

Eu acho que sei o que esta acontecendo,

Antes, que compilador você esta usando?

Ok, agora ao erro,

O scanf com um "%s" le uma string, uma string é uma sequencia de chars que termina com \0, quando você digita "+" e aperta enter ele coloca "+\0", o "+" vai para a variavel certa, o "\0" vai para a variavel B e sobreescreve o valor anterior, por isso o resultado sempre é A, a duas formas de resolver isso:

1) Transforma a variavel opcao em um vetor (char opcao[2];)

2) Troca o %s por %c (%c le um único char).

Postado

carlosd, você construio cade linha desse código-fonte muito bem, utilizando o if, else if. Mas pra esse tipo de exemplo acho melhor usar o comando switch, porque fica bem mais prático de escrever e entender as sintaxe.

Postado

valeu aí amigos pelas as dicas, nessa linguagem a cada conselho que a gente recebe, mais rico fica a aprendizado, qualquer coisa, volto a perguntar

Postado

aí pessoal estava lendo sobre o comando switch, isso é verdade mesmo? não posso usar variaveis reais e nem strings? por que? alguém pode me explicar?

"expressão é comparada com cada constante para determinar qual será o próximo comando a ser executado. Se expressão for igual a constante1, comando1 é executado, se for igual a constante2, comando2 é executado, e assim por diante. Se expressão não for igual a nenhuma constante, então o comando default é executado. A expressão deve ser inteira, expressões float, double ou string são inválidas;"

Postado
aí pessoal estava lendo sobre o comando switch, isso é verdade mesmo? não posso usar variaveis reais e nem strings? por que? alguém pode me explicar?

"expressão é comparada com cada constante para determinar qual será o próximo comando a ser executado. Se expressão for igual a constante1, comando1 é executado, se for igual a constante2, comando2 é executado, e assim por diante. Se expressão não for igual a nenhuma constante, então o comando default é executado. A expressão deve ser inteira, expressões float, double ou string são inválidas;"

O comando switch e o comando if-else-if são semalhantes. A diferença fundamental é que a estrutura switch simplesmente não aceita expressões e sim constantes. Então o switch testa a variável e executa a declaração cujo case corresponde ao valor atual da variável inteira, por isso, de todo modo tem que ser constante inteira. Logo não tem necessidade de alguma constante ser em ponto flutuante(float) ou char. Além disso daria erro na hora da compilação. Portanto o switch é o comando de expressão condicional de modo direto. Já declaração default é opcional e será executada apenas se a variável, que está sendo testada, não for igual a nenhuma das constantes. O comando break, faz com que o switch seja quebrado assim que uma das declarações seja executada. Mas ele não é essencial ao comando switch. Nesse caso se não houver um break, o programa continuará executando(os outros cases).

Faça o teste com o exemplo que você fez neste tópico e você verá como é bem mais estruturado usando o comando switch.

Postado

valeu cara entendi, eu ando praticando muito quanto a C, constantemente me surgem duvidas, como essa, fiz um algoritmo que pede o nome do cliente, o tipo de conta dele e o saldo bancario e de acordo com isso, imprimir o nome do cliente, e a taxa que ele deve pagar, o algoritmo feito em C, esta aí:

#include<stdio.h>

#include<string.h>

int main(void)

{

int conta;

float saldo;

char nome[30];

printf("qual seu nome:");

scanf("%c",&nome);

strcpy(nome,"nome");

printf("qual sua conta:");

scanf("%d",&conta);

printf("qual saldo bancario:");

scanf("%f",&saldo);

if((conta==1)&&(saldo<1000,00)){//começo do então a

printf("o valor é 25,00");

}//fim do então a

else{//começo do senao a

if((conta==2)&&(1000,00>saldo)&&(saldo<2000,00)){//começo do então b

printf("o valor é 20,00");

}//fim do então b

else{//começo do senao b

if((conta==3)&&(saldo>2000.00)&&(saldo<3500.00)){//começo do então c

printf("o valor é 13,00");

}//fim do então c

else{//começo do senao c

if((conta==4)&&(saldo>=3500.00)){//começo do então d

printf("a taxa é isenta");

}//fim do começo d

}//fim do senao c

}//fim do senao b

}//fim do senao a

}//fim do main

a compilação deu tudo certo, mais na hora, que vou executar, ele pede o nome, e quando digito, ele pula e termina e fica assim, "qual sua conta:qual seu saldo bancario", e termina, o que poderia estar errado?

  • Membro VIP
Postado


if((conta==1)&&(saldo<1000,00)){//começo do então a

Um detalhe, no C se uso ponto ( . ) para separar valores decimais e não virgula (,)

Postado

carlosd, como o EduardoS explicou, o "%c" é somente para caracteres (1byte), então já que você criou o vetor nome[30]; o certo é usar o "%s" para armazenar cadeia de caracteres (strings) e não só um caractere ("%c").

Outra coisa, para ler uma string do teclado, o certo é usar a função gets(nome_da_string); e não scanf("%s",&nome_da_string);

falou!

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!