Ir ao conteúdo
  • Cadastre-se
MassakiMsk

Me ajudem a descobrir o erro em C

Recommended Posts

#include<stdio.h>int main(){    int op;    double vi, pc, vf;    char jd;    char dg = '%';    printf("Digite:\n1 para descobrir o valor inicial\n2 para descobrir a porcentagem de juros ou desconto\n3 para descobrir o valor total\n");    scanf("%d", &op);    if (op==1){    printf("digite + para juros ou - para descontos\n");    scanf("%c", &jd);    switch (jd){        case '+':        printf("entre com o juros\n");        scanf("%lf", &pc);        printf("entre com o valor final\n");        scanf("%lf", &vf);        vi=vf*100/(100+pc);        printf("\n\n\n");        printf("Valor inicial = R$ %.2lf\n", vi);        printf("Juros de %.2lf%c\n", pc, dg);        printf("Valor final = R$ %.2lf\n", vf);        printf("\n\n\n");        break;        case '-':        printf("entre com o desconto\n");        scanf("%lf", &pc);        printf("entre com o valor final\n");        scanf("%lf", &vf);        vi=vf*100/(100-pc);        printf("\n\n\n");        printf("Valor inicial = R$ %.2lf\n", vi);        printf("Desconto de %.2lf%c\n", pc, dg);        printf("Valor final = R$ %.2lf\n", vf);        printf("\n\n\n");        break;        }    }    else if (op==2) {        printf("ainda nao esta pronto");    }    else if (op==3) {        printf("ainda nao esta pronto");    }    else {        printf("digite um numero valido");    }    return 0;}

primeiro eu tentei nesse metodo de cima usando o if else, depois tentei o metodo de baixo usando switch para escolher as opções.

#include<stdio.h>int main(){    int op; // opção    double vi, pc, vf; // valor inicial, porcentagem, valor final    char jd; // juros ou desconto    char dg = '%'; // nao sei imprimeir %, então usei uma variavel para isso    printf("Digite:\n1 para descobrir o valor inicial\n2 para descobrir a porcentagem de juros ou desconto\n3 para descobrir o valor total\n");    scanf("%d", &op);    switch (op){        case 1:        printf("digite + para juros ou - para descontos\n");        scanf("%c", &jd);        switch (jd){            case '+':            printf("entre com o juros\n");            scanf("%lf", &pc);            printf("entre com o valor final\n");            scanf("%lf", &vf);            vi=vf*100/(100+pc);            printf("\n\n\n");            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Juros de %.2lf%c\n", pc, dg);            printf("Valor final = R$ %.2lf\n", vf);            printf("\n\n\n");                break;            case '-':            printf("entre com o desconto\n");            scanf("%lf", &pc);            printf("entre com o valor final\n");            scanf("%lf", &vf);            vi=vf*100/(100-pc);            printf("\n\n\n");            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Desconto de %.2lf%c\n", pc, dg);            printf("Valor final = R$ %.2lf\n", vf);            printf("\n\n\n");                break;            }            case 2:                printf("em desenvolvimento");                break;            case 3:                printf("desenvolvendo");                break;            default:                printf("Digite um numero valido");                break;        }    return 0;}

quando eu digito a opção 1 ele simplesmente imprime:

digite + para juros ou - para descontosem desenvolvimento 

e finaliza o codigo.

 

Sou iniciante em programação, por isso nao consegui resolver o erro sozinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

^-^

 

1º erro:
Quando você escreveu a parte do  

 

switch (op){

        case 1:
 
você esqueceu de colocar o break; dele la em baixo logo acima do "case 2"
 
isso fez com que o programa pulasse para o "em desenvolvimento"


2º erro

na hora do "scanf("%c", &jd);" use %s ao invés de %c. no momento não sei explicar o porque mas com o %c estava dando problema.
 
qualquer duvida me pergunte!

(5 min de forum e ja ajudei uma pessoa o/)
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado, funcionou o %s, mas nao entendi porque.
e o break eu realmente tinha esquecido, mas mexer com muitas linhas me deixou confuso rsrs

 

No fim o codigo ficou assim:

#include<stdio.h>int main(){    int op; // opção    double vi, pc, vf; // valor inicial, porcentagem, valor final    char jd; // juros ou desconto    char dg = '%'; // nao sei imprimeir %, entao usei uma variavel para isso    printf("Digite:\n1 para descobrir o valor inicial\n2 para descobrir a porcentagem de juros ou desconto\n3 para descobrir o valor total\n");    scanf("%d", &op);    switch (op){        case 1:        printf("digite + para juros ou - para descontos\n");        scanf("%s", &jd);        switch (jd){            case '+':            printf("entre com o juros\n");            scanf("%lf", &pc);            printf("entre com o valor final\n");            scanf("%lf", &vf);            vi=vf*100/(100+pc);            printf("\n\n\n");            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Juros de %.2lf%c\n", pc, dg);            printf("Valor final = R$ %.2lf\n", vf);            printf("\n\n\n");                break;            case '-':            printf("entre com o desconto\n");            scanf("%lf", &pc);            printf("entre com o valor final\n");            scanf("%lf", &vf);            vi=vf*100/(100-pc);            printf("\n\n\n");            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Desconto de %.2lf%c\n", pc, dg);            printf("Valor final = R$ %.2lf\n", vf);            printf("\n\n\n");                break;            }            break;        case 2:        printf("Entre com o valor inicial\n");        scanf("%lf", &vi);        printf("Entre com o valor final\n");        scanf("%lf", &vf);        pc=100*(vf-vi)/vi;        if (pc>0){            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Juros de %.2lf%c\n", pc, dg);            printf("Valor final = R$ %.2lf\n", vf);           }        else if (pc<0){            pc=pc*(-1);            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Desconto de %.2lf%c\n", pc, dg);            printf("Valor final = R$ %.2lf\n", vf);        }        else{            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Juros ou desconto nulo");            printf("Valor final = R$ %.2lf\n", vf);        }            break;        case 3:        printf("Digite + para juros ou - para desconto");        scanf("%s", &jd);        switch (jd){            case '+':            printf("Entre com o valor inicial\n");            scanf("%lf", &vi);            printf("Entre com o juros\n");            scanf("%lf", &pc);            vf=vi*(100+pc)/100;            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Juros de %.2lf%c\n", pc, dg);            printf("Valor final = R$%.2lf\n", vf);                break;            case '-':            printf("Entre com o valor inicial\n");            scanf("%lf", &vi);            printf("Entre com o desconto\n");            scanf("%lf", &pc);            vf=vi*(100-pc)/100;            printf("Valor inicial = R$ %.2lf\n", vi);            printf("Desconto de %.2lf%c\n", pc, dg);            printf("Valor final = R$%.2lf\n", vf);                break;            }            break;        default:            printf("Digite um numero valido");            break;    }    return 0;}

Só faltou ajeitar alguns espaços entre as entradas e as saidas, mas funcionou.
Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, pode parecer mais complicado mas utilizar o cout e o cin vai tornar sua programação mais e mais limpa.

mas se você for como eu e ainda está aprendendo faz o seguinte;

ao invés de você utilizar a entrada para %s (que lê uma string, frase "isto é uma string") seria melhor utilizar a entrada para %d (que lê um valor inteiro 1, 2, 3, 4, 5, 6, 7, 8, 9, 0) ou para %f (que lê um valor flutuante (float) real 1.5, 2.37, 10.356789) atribuindo de forma mais limpa ao programa determinado valor.

mas é mais fácil utilizar cout e cin pois sao mais inteligentes:

printf("digite um valor; ");

scanf("%d", &variavel);

printf("\n\ndigite outro valor: ");

scanf("%d", &variavel2);

printf("\n\no resultado de %d multiplicado por %d é %d",variavel, variavel2, variavel2*variavel);

sysrem("pause");// exibe o resultado antes de fechar a função ou o proprio programa em si e serve somente em wndows ja q é comando do sistema operacional

e imprime...

ja com o cout e o cin

cout<<"digite um valor: ";

cin>>variavel;

cout<<"\n\ndigite outro valor: ";

cin>>variavel2;

cout<<\n\n"o resultado de"<<variavel<<" multiplicada por "<<variavel2<<" é "<<variavel*variavel2;

system("pause");

e imprime...

cout é inteligente porque consegue transformar o int em float...ou seja o tipo de dado a ser impresso

exemplo

eu quero achar quanto vale 1% de 10 (que é 0.1) e quero receber o valor real

cout<<(float)1*10/100<<" é"<<variavel<<"% de "<<variaveltotal;

e imprime 0.1 é 1% de 10

note q eu n especifiquei o %% que imprime o sinal de porcentagem isso porque, como eu disse, cout é inteligente

então o que tudo isso signica? o tamanho dos dados e o tamanho do seu programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

porque não usa While infinito ex:

 

Seu código em C++ com while

#include <iostream>#include <stdlib.h>using namespace std;int main(void){		int op;	float vi, pc, vf;	char jd, dg = '%';		while(1){		cout<< "Digite:\n1 para descobrir o valor inicial\n2 para descobrir a porcentagem de juros ou desconto\n3 para descobrir o valor total\n"<<endl;		cin >> op;		switch (op){        case 1:        cout<<"digite + para juros ou - para descontos\n"<<endl;        cin>>jd;        switch (jd){            case '+':            cout<<"entre com o juros\n"<<endl;            cin>>pc;            cout<<"entre com o valor final\n"<<endl;            cin>>vf;            vi = vf * 100 /( 100 + pc);            cout<<"\n\n\n"<<endl;            cout<<"Valor inicial = R$ "<< vi<<"\n"<<endl;            cout<<"Juros de "<< pc<< dg<<"\n"<<endl;            cout<<"Valor final = R$ "<< vf<<"\n"<<endl;                break;            case '-':            cout<<"\n\n\nentre com o desconto\n"<<endl;            cin>>pc;            cout<<"entre com o valor final\n"<<endl;            cin>>vf;            vi= vf * 100 /( 100 - pc);            cout<<"\n\nValor inicial = R$ "<< vi<<"\n"<<endl;            cout<<"Desconto de " << pc << dg<<"\n" << endl;            cout<<"Valor final = R$ "<< vf<<"\n" << endl;                break;            }		}            break;        case 2:        cout<<"Entre com o valor inicial\n"<<endl;        cin>>vi;        cout<<"Entre com o valor final\n"<<endl;        cin>>vf;        pc=100*(vf-vi)/vi;        if (pc>0){            cout<<"Valor inicial = R$ "<< vi<<"\n"<<endl;            cout<<"Juros de "<< pc<< dg<<"\n"<<endl;            cout<<"Valor final = R$ "<< vf<<"\n"<<endl;           }        else if (pc<0){            pc=pc*(-1);            cout<<"Valor inicial = R$ "<< vi<<"\n"<<endl;            cout<<"Desconto de "<< pc<< dg<<"\n"<<endl;            cout<<"Valor final = R$ "<< vf<<"\n"<<endl;        }        else{            cout<<"Valor inicial = R$ "<< vi<<"\n"<<endl;            cout<<"Juros ou desconto nulo"<<endl;            cout<<"Valor final = R$ "<< vf<<"\n"<<endl;        }            break;        case 3:        cout<<"Digite + para juros ou - para desconto"<<endl;        cin>>jd;        switch (jd){            case '+':            cout<<"Entre com o valor inicial\n"<<endl;            cin>>vi;            cout<<"Entre com o juros\n"<<endl;            cin>>pc;            vf=vi*(100+pc)/100;            cout<<"Valor inicial = R$ "<< vi<<"\n"<<endl;            cout<<"Juros de "<< pc << dg <<"\n"<<endl;            cout<<"Valor final = R$ "<< vf <<"\n"<<endl;                break;            case '-':            cout<<"Entre com o valor inicial\n"<<endl;            cin>>vi;            cout<<"Entre com o desconto\n"<<endl;            cin>>pc;            vf=vi*(100-pc)/100;            cout<<"Valor inicial = R$ "<< vi <<"\n"<<endl;            cout<<"Desconto de "<< pc << dg <<"\n"<<endl;            cout<<"Valor final = R$ "<< vf <<"\n"<<endl;                break;            }            break;        default:            cout<<"Digite um numero valido"<<endl;            break;    }	return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa especificar o tipo que você desejar "printar" na tela, pois para o C não é apenas jogar um texto lá.

A variável que vai ser escrita %s é um ponteiro ou seja uma "cadeia" de espaços em memória que guardam bytes, por isso que você precisa especificar se é string ou byte.

 

C, por ser uma linguagem fortemente TIPADA, exige que você faça da maneira mais "correta".

 

Byte = 1 espaço na memória

String = Vários espaços (assim ele entende que precisa pegar todos os espaços do ponteiro.)

 

Não expliquei bem, mas qualquer dúvida é só perguntar que explico novamente.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×