Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

me3us

Primeiro Programa

Mensagens Recomendadas

me3us

Boas, é a primeira vez que posto aqui, e é a minha primeira vez aqui, por isso não sei se está certo, mas tenho um problema que nao se como resolver, o programa é basico, mas eu comecei a ler Linguagem C de Luís Damas, e ainda estou no 3º capitulo, e hoje fiz esse programa, so que nao esta a executar como quero, se alguem me podesse ajudar agradecia...

#include <stdio.h>

main()

{
unsigned int dia,mes,ano,ano_r,ttl;
float a, b;
char nom[50], u_nom[50],sexo[9],local_nasc[20], opccao, op;

printf("Escolhe uma opção (n/N - números, l/L - Letras): ");
scanf("%c",&opccao);

	if (opccao=='n' || opccao=='N')

		{
			printf("Escolhe uma das seguintes básicas operações: Multiplicação - M/m; Divisão - D/d; Adição - A/a; Subtracção - S/s\n");
			printf("Escolhe uma operação:  ");
			scanf("%c",&op);

				{if (op == 'M' || op=='m')
				ttl=a*b;

				else

				if(op == 'D' || op=='d')
				ttl=a/b;

				else
				if (op == 'A' || op=='a')
				ttl=a+b;

				else

				if (op == 'S' || op=='s')
				ttl=a-b;}

			printf("Escreve dois números: ");
			scanf("%f%f",&a,&b);
			printf("O Total é: ",ttl);
		}

	else

		if(opccao=='l' || opccao=='L')

		{
			printf("Em que ano estás: ");
			scanf("%u",&ano_r);
			printf("Escreve o teu Nome Próprio: ");
			gets(nom);
			printf("Escreve o teu Apelido: ");
			scanf("%s",u_nom);
			puts("Escreve o teu Sexo: ");
			gets(sexo);
			printf("Escreve a tua Data de Nascimento: ");
			scanf("%u %u %u",&dia,&mes,&ano);
			printf("Escreve o Local de Nascimento: ");
			scanf("%s",local_nasc);
			printf("Eu chamo-me %s %s,tenho %u anos, sou natural de %s em %u/%u/%u e sou do sexo %s\n",nom,u_nom,ano-ano_r,local_nasc,mes,dia,ano,sexo);
			puts("P.S.:A idade pode estar um bocado desactualizada lol.");
		}

	else

		puts("Error 404 Democracy Not Found, não, estava a brincar xD, não sei que acrescentar, acaba aqui lol.");
}

Já agora, uso linux, não sei se é relevante ou nao...

Brigado desde ja a quem responder. :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Como é que queres que execute?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Estás a realizar a operação (multiplicar, dividir, adicionar ou subtraír) antes de pedires os valores ao utilizador. E o teu último else não serve para nada. Já tens um else.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mundo

scanf("%c",&opccao);

coloca antes assim pelo menos para ja;

scanf(" %c",&opccao);

O espaço antes do %c vai te limpar o "lixo" que vem ou pode vir junto

E porque nao um switch em vez desses if's elses's todos? Ficaria muito mais legivel

E por ultimo algo tipo:

gets(nom);

Nunca!

Ao inves disso usa:

fgets(nom, 50, stdin)

Isto preveni-te de futuros exploits, tipo stack overflow, etc.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
S7sRuss

Estás a realizar a operação (multiplicar, dividir, adicionar ou subtraír) antes de pedires os valores ao utilizador. E o teu último else não serve para nada. Já tens um else.

Pois. Estás a fazer as coisas ao contrário. Não deste algoritmia?

Em linguagem comum estás a fazer o seguinte:

Qual é opção?
Obter opcao.
Se opção for N fazer{
    Qual é a operação?
    Fazer contas com a operação.      //Como se é que faz contas sem saber os valores?
    Quais são os números para a conta?            
    Escrever o resultado...                               
}senão, fazer{

    Se opção for L fazer{
          ...
    }senão, fazer{
        escrever("democracy not found");  //Não faria mais sentido: escrever("Opção desconhecida");
    }

}

Quando se é iniciante, o melhor é descrever os passos do programa num papel... Senão cometem-se erros...


"Lamento... Detectou mais de dez mil ficheiros infectados..."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
luis_costa

O que tens que mudar é pedires primeiro para introduzir o a e o b antes de fazeres o cálculo com eles.

Depois, devias pegar nesses ifs todos e substituí-los por switches.

E como já disseram aqui, se és um programador iniciado devias escrever num papel em pseudocódigo aquilo que estás a colocar no programa. A programação não é nada mais nada menos que a execução de instruções lógicas numa sequência, por isso, se no papel o que tens não faz sentido, vai sair mal também no programa.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
me3us

Brigado pessoal pela ajuda, ja consegui melhorar a parte dos números, e ja funciona, mas agora ainda tenho problemas com a parte das letras, eu nao estou a usar o switch porque ainda nao cheguei a essa parte, ainda nao o sei implementar, so me podessem ajudar depois na outra parte agradecia...

Ps.: Vou começar a fazer as anotaçoes primeiro, e depois escrever.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
me3us

Como é que queres que execute?

Quero tipo que execute o que eu mande: tipo se eu meter o L/l execute Letras, por assim, e se eu nao meter nada ou um que nao esteja que dê a ultima mensagem!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
me3us

#include <stdio.h>

main()

{
unsigned int dia,mes,ano,ano_r,ttl;
float a, b;
char nom[50], u_nom[50],sexo[9],local_nasc[20], opccao, op;

printf("Escolhe uma opção (n/N - números, l/L - Letras): ");
scanf(" %c",&opccao);

	if (opccao=='n' || opccao=='N')

		{
			printf("Escreve dois números: ");
			scanf(" %f %f",&a,&b);
			puts("Escolhe uma das seguintes básicas operações: Multiplicação - M/m; Divisão - D/d; Adição - A/a; Subtracção - S/s");
			printf("Escolhe uma operação:  ");
			scanf(" %c",&op);

				if (op == 'M' || op=='m')
				ttl=a*b;

				else

				{if(op == 'D' || op=='d')
				ttl=a/b;

				else
				if (op == 'A' || op=='a')
				ttl=a+b;

				else

				if (op == 'S' || op=='s')
				ttl=a-b;}

			printf("O Total é: %u \n",ttl);
		}

	else

		if(opccao=='l' || opccao=='L')

		{

			printf("Escreve o teu Nome Próprio: ");
			fgets(nom, 50, stdin);
			printf("Escreve o teu Apelido: ");
			fgets(u_nom, 50, stdin);
			printf("Em que ano estás: ");
			scanf(" %u", &ano_r);
			puts("Escreve o teu Sexo: ");
			fgets(sexo, 9, stdin);
			printf("Escreve a tua Data de Nascimento: ");
			scanf(" %u %u %u", &dia, &mes, &ano);
			printf("Escreve o Local de Nascimento: ");
			fgets(local_nasc, 20, stdin);
			printf("Eu chamo-me %s %s, tenho %u anos.\n", nom, u_nom, ano - ano_r);
			printf("Sou natural de %s, nascido em %u/%u/%u, e do sexo %s.\n", local_nasc, mes, dia, ano, sexo);
			puts("P.S.:A idade pode estar um bocado desactualizada lol.");
		}

	else
		puts("Error 404 Democracy Not Found, não, estava a brincar xD, não sei que acrescentar, acaba aqui lol.");
}

ja fiz as alterações, mas continua-me a dar mal a parte das letras.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Nao mistures fgets() com scanf().

Se precisas de alguma coisa da familia do scanf(), usa fgets() primeiro e depois sscanf() para aceder a string entrada.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Nao mistures fgets() com scanf().

Se precisas de alguma coisa da familia do scanf(), usa fgets() primeiro e depois sscanf() para aceder a string entrada.

Isto... O tratamento de IO é algo bastante confuso devido às diferentes maneiras como ele é bufferizado nos diferentes SO's. Pode ser especialmente chato em Linux, onde o fflush(stdin) não funciona como a gente gostaria. Por isso reitero o conselho do pmg. Usa o fgets para leres a linha inteira que o utilizador digita, e depois podes usar o sscanf para retirares os valores que pretendes de dentro desse input.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
me3us

Nao mistures fgets() com scanf().

Se precisas de alguma coisa da familia do scanf(), usa fgets() primeiro e depois sscanf() para aceder a string entrada.

Isto... O tratamento de IO é algo bastante confuso devido às diferentes maneiras como ele é bufferizado nos diferentes SO's. Pode ser especialmente chato em Linux, onde o fflush(stdin) não funciona como a gente gostaria. Por isso reitero o conselho do pmg. Usa o fgets para leres a linha inteira que o utilizador digita, e depois podes usar o sscanf para retirares os valores que pretendes de dentro desse input.

eu ainda nao sei usar o sscanf(), e a maior parte do que estao a dizer para mim ainda é chines, ainda nao sou muito avançado como voces lol, espero que nao se chateiem e coompreendam.

Como é que eu uso o fgets() e depois o sscanf()? :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Tanto o fgets como o sscanf são formas específicas do gets e do scanf, respectivamente:

http://linux.die.net/man/3/fgets

http://linux.die.net/man/3/sscanf

printf("Escreve a tua Data de Nascimento: ");
fgets(buffer,49,stdin);
sscanf(buffer," %u %u %u", &dia, &mes, &ano);

Basicamente lês tudo para uma string buffer, e depois usas o sscanf para ires buscar os valores.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.