View Full Version : Problema com C


frog
29-06-2006, 20:09
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");





}

frog
29-06-2006, 20:15
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?

frog
29-06-2006, 21:03
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.

frog
29-06-2006, 21:12
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?

frog
29-06-2006, 21:56
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.

frog
30-06-2006, 01:22
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...

xplor
30-06-2006, 01:24
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?

frog
30-06-2006, 01:38
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

xplor
01-07-2006, 02:41
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

frog
01-07-2006, 12:04
Pois foi esse que eu comprei ontem :), e mesmo excelente, ele ensina mesmo do basico! Aconselho a todos os que se estejam a iniciar

HecKel
01-07-2006, 13:32
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

xplor
01-07-2006, 17:57
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

Warrior
02-07-2006, 01:25
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.

HecKel
02-07-2006, 17:26
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

FASC
03-07-2006, 01:09
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!