View Full Version : Problema com C
Ola, como ainda estou no principio de C fiz um programa bem basico uma calculadora para adicionar e para subtrair, em que vcs carregam 1 para advionar e 2 para subtrair o problema e que se eu carregar 1 ou 2 vao os dois para adcionar, vcs sao a minha unica ajuda, como ainda nao tenho a disciplina de Informatica , vou parendendo pela net e por livros aqui vai o codigo:
#include <stdio.h>
#include <windows.h>
float a , b;
char ch;
int main()
{
printf("ola, escolha um numero\n<1> para soma\n<2> para subtracçao\n >> ");
scanf("%c" , &ch);
if (ch=1)
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a+b);
printf("\nBy JoAoZaO");
}
if (ch=2);
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a-b);
} printf("\nBy JoAoZaO");
}
desculpei o codigo, postei o codigo errado ,o codigo certo e o seguinte
#include <stdio.h>
#include <stdlib.h>
float a , b;
char ch;
int main()
{
printf("ola, escolha um numero\n<1> para soma\n<2> para subtracçao\n >> ");
scanf("%c" , &ch);
if (ch=1)
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a+b);
printf("\nBy JoAoZaO");
}
if (ch=2);
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a-b);
} printf("\nBy JoAoZaO");
system("pause>nul") ;
return 0;
}
Jorge Candeias 29-06-2006, 20:43 Análise rápida:
tu nos ifs estás mesmo a dizer que ch é = a 1 ou a 2, mas o que tu queres é fazer a pergunta, logo tens de meter == nos if's
if(ch == 1)
do something;
e não
if(ch = 1)
...;
de resto parece ok, mas não olhei muito atentamente :)
Cumprimentos
Koncaman 29-06-2006, 20:58 se queres fazer uma comparação no if, tens que fazer
if(variavel == x){
}
e porque é que ch é um caracter se o vais usar como um inteiro?
Ok obrigado deu certo! Alguem pode-me explcar qual era a diferença entre por = ou ==?
Vou agora por as funçoes dividir e multiplicar, e pena nao me dar muito bem com o switch...
Koncaman 29-06-2006, 21:08 com o igual fazes uma atribuição, com o == fazes uma comparação.
ja agora, deve por um else depois dos dois if para salvaguardares a hipotese do utilizador não ter introduzido nem 1 nem 2.
no 2º if estas a usar ; e depois { isso também não é muito boa politica.
novo problema, e de isto que eu nao gosto em aprender uma linguagem, e cometer erros nao saber como resolvelos e vir para aqui, dve ser um bcd chato pa vcs, mas...ajudem o problema e que eu acrescentei multiplicaçao e divisao e agora da-se o mesmo problema!
#include <stdio.h>
#include <stdlib.h>
float a , b;
char ch;
int main()
{
printf("ola, escolha um numero\n<1> para soma\n<2> para subtracçao\n<3> para multiplicacao\n<4> para divisao\n >> ");
scanf("%c" , &ch);
if (ch==1);
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a+b);
printf("\nBy JoAoZaO");
}
if (ch==2);
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a-b);
}
if (ch==3);
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a*b);
}
if (ch==4);
{
printf(">>");
scanf("%f" , &a);
printf(">>");
scanf("%f" , &b);
printf("O resultado e: %.2f" , a/b);
}
printf("\nBy JoAoZaO");
system("pause>nul") ;
return 0;
}
Koncaman 29-06-2006, 21:29 ou bem que metes ; ou bem que metes { depois do if.
e neste caso, deves por apenas as chavetas (que ja la estão).
mas isso n te da warnings? que compilador é que tas a usar?
Ja resolvi o problema, mudei CH de char para int, e tirei os ; ! O meu compilador e o Dev-c++!
agora tenho um novo problema , esta calculadora so serve para fazer um calculo, e depois tem que se fechar e voltar a abrir, como e que eu faço para dar para fazer varios calculos, eu acho que tenho que usar o "for" mas nao sei como...
MaxDamage 29-06-2006, 22:33 podes fazer uma coisa do genero:
(...)
char aux;
do
{
/* o codigo que tens para pedir dois numeros e fazer o calculo */
printf(" Deseja continuar ? (s/n) -> ");
aux = getchar();
printf(" \n \n ");
} while ( aux == 's');
claro que isto é o mais básico possivel, este código não verifica se é inserido um caracter diferente de 's' ou 'n', etc... mas acho que dá pa ver a ideia.
edit - alteração da pergunta
Koncaman 29-06-2006, 23:10 MaxDamage é
while ( aux != 's');
também podes fazer a calculadora de forma mais intruitiva, e bastante mais interessante de programar...
sendo que o formato de intridução pode ser algo dso tipo
"nºy+nºx"
e o resultado algo do tipo "= nºz"
ou um mais simples
nºx (return)
operação (return)
nºy (return)
=nºz
e fica à espera de uma nova operação até lhe dares indicação que queres sair (i.e. carregares numa letra, por ex).
podes ainda eventualmente usar o resultado anterior, como entrada da operação seguinte...
assim fazes uma calculadora mais intruitiva de usar, e com maior capacidade de calculo...
mas se calhar ja te estou a dar trabalho a mais :p :D
MaxDamage 29-06-2006, 23:31 err.. s = sim , n = nao
Percorre o ciclo enquanto o caracter de teste for 's' (sim), ou seja, enquanto desejar continuar.
Assim, quando inserir um 'n' (nao), o while retorna falso e sai do ciclo.. por isso meti o while ( aux == 's');
mas pode-me tar a escapar qualquer coisa :D
Koncaman 29-06-2006, 23:44 err.. s = sim , n = nao
Percorre o ciclo enquanto o caracter de teste for 's' (sim), ou seja, enquanto desejar continuar.
Assim, quando inserir um 'n' (nao), o while retorna falso e sai do ciclo.. por isso meti o while ( aux == 's');
mas pode-me tar a escapar qualquer coisa :D
mas a pergunta foi, "deseja sair?"
s = quero sair
logo vai fazer o contrario do que tu queres
MaxDamage 30-06-2006, 00:09 Ups tens razão, a pergunta deveria ser "Deseja Continuar ?". Thanks pela correcção :D
Tuaregue 30-06-2006, 00:16 porque é que não usas case em vez de if? eu sei que estás a aprender, mas neste acho acho que era o mais acertado, e com os cases poderias tb evoluir para funções.
Obrigado pelas respostas mas nao percebi muito bem, aquilo do while e de tornar a calculadora melhor, sera que me podem dar um codigo pronto para eu me basear ou estudar, ou isso e pedir de mais?
Nao uso o case , pq nao consegui, eu tentei mas nao deu...
porque é que não usas case em vez de if? eu sei que estás a aprender, mas neste acho acho que era o mais acertado, e com os cases poderias tb evoluir para funções.
seria mesmo o ideal, mas nesse caso eu aconselhava a utilização de variaveis locais, aliás eu mt raramente uso variaveis globais pq mais cedo ou mais tarde podes ter problemas.
sabes usar funções?
Eu aprendo tudo por livro ou entao , em alguns textos na internet, por isso nao sei usar funçoes mas posso ir ver ja isso
se estás a aprender do zero aconselho-te o livro do damas, "Linguem C", Luis Damas. acho mt bom pra quem está a dar os primeiros passos.
cumps
Pois foi esse que eu comprei ontem :), e mesmo excelente, ele ensina mesmo do basico! Aconselho a todos os que se estejam a iniciar
Boas!
Sobre o Switch case, salvo erro só funciona com numeros mesmo e tu estás a trabalhar com caracteres, em vez de "receberes" um caracter começa a receber um inteiro, afinal de contas é com inteiros que estás a trabalhar.
Sobre o teu problema dos if's, um ponto e virgula coloca-se no final de uma instrução indicando isto mesmo, que é o final dessa instrução. Ao colocares um ponto e virgula LOGO no final do if estás a dizer que o if acaba logo ali, que o está dentro das chavetas não pertence ao if.
Tal como o if, este problema acontece com for's, whiles and so on, tudo o que for blocos.
A indicação de final de bloco é delimitada por um par de chavetas como usas já, no caso desse bloco ser só uma instrução as chavetas podem-se omitir, por exemplo:
if (xpto == 1)
return kkcoisa ;
no caso de bloco:
if (xpto == 2)
{
blablabla++;
blebleble--;
return blablabla+blebleble;
}
Outro cuidado que deves ter é quando usas blocos ifs só de uma instrução e tens um else, a linha imeditamente antes ao else NÃO leva ponto e virgula. No caso de usares chavetas tem um funcionamento igual ao que descrevi anteriormente, por exemplo:
if (xpto == 3)
blabla++
else
blabla--;
Em bloco ficaria assim:
if (xpto == 4)
{
blabla++;
ble += blabla;
} else {
blabla--;
}
Moral da história..., usa sempre chavetas que nunca te enganas :p
Espero ter ajudado :)
abraços, HecKel
Heckel: creio que nos switch case podes comparar tudo, inteiros, floats, chars, string etc.
basta criares uma condição, ou seja, para cada caso do switch, ele executa uma função quando a condilção associada tiver valor lógico diferente de zero, isto é, verdadeira.
cumps
O switch pode comparar caracteres, basta colocar o caracter a comparar dentro de plicas ' '.
A ultima instrução do if, antes do else, leva ; tambem.
Só não se coloca ; antes do else em linguagens como o pascal.
Boas!
No C também não se mete a virgula e muito sinceramente nem sei se aceita com a virgula..., acho que aceita..., não tenho como confirmar agora.
abraços, HecKel
Boas!
No C também não se mete a virgula e muito sinceramente nem sei se aceita com a virgula..., acho que aceita..., não tenho como confirmar agora.
abraços, HecKel
Estás enganado. Em Pascal ou Delphi é que não dá. O compilador dá erro.
Em C, o gcc compila com "-Wall -pedantic" sem warnings nessa situação.
Um abraço!
|
|