Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ulfreitas

[Resolvido] da pra melhorar esse codigo

Recommended Posts

boa tarde

eu comecei a estudar ling.C, fiz esse código pra ler um número e dizer se é par ou impar

ta funcionando mas é a melhor forma de escrever ele? daria pra melhorar? e como é q faço pra permitir q a pessoa digite apenas numeros inteiros, nada de reais ou caracter?

 

# include <stdio.h>
#include <conio.h>
main()
{
// declaração de variáveis
int valor; //entrada de dados
int result; //saida de dados
// comandos 
printf("Digite um numero inteiro ");
scanf("%d", &valor);
result = valor%2; // obtendo o mod do numero digitado
if (result == 0){
      	printf("o numero %d e par",valor);
      	}
      	else {
               printf("o numero %d e impar",valor);
               }
getch();
}

 

Obrigado

 

 

Observaçao

Descobri um erro no programa quando eu coloco numeros muito grandes tipo 131554863218684 aparece um outro numero no printf() pq acontece isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se pode "obrigar" o usuário a digitar apenas int, mas podemos limitar a quantidade de dígitos digitados pelo usuário com while como no código abaixo, para não ocorrer o problema que você citou.

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
   // declaração de variáveis
   int valor; //entrada de dados

   printf("Digite um numero inteiro: ");
   scanf("%d", &valor);

   while (valor < 0 || valor > 999999999 ) { // limita a quantidade de numeros digitados pelo usuário. 
         printf ("\nDigite um numero entre 0 e 999999999: ");
         scanf("%d", &valor);
         }

  if (valor % 2 == 0){ // obtendo o mod do número digitado e verificando se o resto é 0.
      printf("\nO numero %d %c par",valor,130);
      } else {
             printf("\nO numero %d %c impar",valor,130);
             }
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gr4v370

kramba gostei muito disso aqui [ if (valor % 2 == 0){ ] você resolveu com uma única variável e mando o calculo em cima dela direto, se eu tivesse visto antes teria mandado pra professora dessa forma, bom agora ja sei q da pra fazer

Uma duvida esse "return 0;" é o mesmo q "getch();" - eu uso getch(); pra poder ver o resultado, se nao o programa fecha tudo q nem vejo o q aconteceu, só q eu li que usar o getch é errado pra fazer isso. o mais correto seria o return?

 

To fazendo ciencia da computação, nao sabia q tinha tanto calculo no curso, queria q tivesse mais programação, mas to curtindo valeu pela ajuda

 

----------------------------------------

mais uma coisa e essa #include <stdlib.h>, eu tava usando a conio.h, mas parece q tá obsoleta é isso mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

getch() é uma função do antigo ms-dos para pegar um caractere sem mostrar ele no console. Pode e é muito usado para parecer uma função para pausar o programa.

 

Return retorna um valor dado por uma função para o chamador dessa função, que, no caso de main(), retorna se o programa teve sucesso (retornando 0), ou se teve problemas na execução (retornar outro valor diferente de 0). Isso não pausa o programa, apenas faz com que ele termine da maneira correta.

 

Tem duas formas que eu conheço que produzem bom resultado para pausar, o getch(), que utiliza o header <dos.h>, ou o header mais novo (porém antigo também) <conio.h>. Deve-se usar _getch() hoje em dia, por uma convenção feita não-sei-quando-não-sei-aonde-não-sei-por-que.

 

Outro modo de pausar é incluir o header <stdio.h> (ou <cstdio> em C++) e utilizar o executável de pausa do sistema operacional, que no caso do windows é o PAUSE. Então você usa a função system() para chamar o PAUSE, digitando: system("PAUSE");

 

Mas usar o system("pause") é pior ainda que usar o _getch(), por isso nunca o use. Eu uso o _getch() pois se não usasse isso, teria que usar o system("pause") ou, por exemplo, o scanf(), e isso mostraria caracteres digitados na tela, o que não é bem o que eu gostaria.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi Lord, valew pela explicação, outro dia tentei usar o system("pause"); mas deu erro.

 

Grato pela atenção de vcs, vo voltar outras vezes pra tirar mais duvidas, hehehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Lord Evil já respondeu sua duvida.

Mas se você estiver usando o Dev-C++, pode usar o comando system("PAUSE"), que funciona perfeitamente para pausar o programa antes de fecha-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Lord Evil já respondeu sua duvida.

Mas se você estiver usando o Dev-C++, pode usar o comando system("PAUSE"), que funciona perfeitamente para pausar o programa antes de fecha-lo.

 

deu certo tambem, so q aparece escrito "Precione qualquer tc pra continuar", tem como tirar essa frase?

e outra coisa system("PAUSE"); pertence a bliblioteca #include <stdlib.h>? pq só funciono depois q eu coloquei ela.

nesse comando -> printf("\nO numero %d %c impar",valor,130); pra que serve o 130 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que eu saiba não tem como tirar essa frase, mas não faz diferença ela serve apenas para informar que o programa terminou.

Quanto ao "130" usei isso só para a letra "e" no printf ficar com o acento agudo, o número 130 na tabela ASCII corresponde a letra "e" com acento agudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah os acentos intendi, já havia lido algo a respeito. Obrigado

 

Quanto a essa parte eu nao tenho mais dúvidas.

se quiser pode fechar o post

Obrigado pessoal ai, valew té a próxima

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Para tirar a frase do system("pause"), é mais recomendado usar o _getch() do <conio.h>, pois olhe como o system("pause") funciona:

 

1: Chama o sistema de console padrão do Sistema Operacional (no caso do windows, o cmd.exe)

2: Espera o cmd.exe abrir

3: cmd.exe abre

4: Envia o código pause para o cmd.exe

5: cmd.exe interpreta o código enviado

6: cmd.exe chama o programa pause.exe

7: pause.exe abre

8: pause.exe pausa o programa

 

9: usuário aperta uma tecla

 

10: pause.exe despausa o programa

11: pause.exe retorna para o cmd.exe

12: pause.exe fecha

13: cmd.exe retorna para o programa

14: cmd.exe fecha

 

Agora, se você chamar o _getch(), o programa é muito mais rápido, pois é um função feita em C + Assembly de uma biblioteca interna da C/C++, o que é MUITO mais rápido:

 

1: Chama a função _getch()

2: _getch() pausa o programa

 

3: usário aperta uma tecla

 

4: _getch() despausa o programa

5: _getch() retorna

 

O gasto de tempo e desempenho é MUITO maior no pause do que no _getch(), além de que o código do _getch() em si é mais rápido que o do pause. Então, abandone o system("pause") e seja feliz com um programa mais rápido.

 

Mas, se ainda quer usar o mesmo, para remover a mensagem tente:

system("PAUSE>NUL");

 

ou

 

system("PAUSE>NULL");

 

Os dois funcionam no CMD normal, mas parece que um desses aê não funciona se usar o system("command").... ou quem sabe os dois...

 

 

Explicado?

 

Abraços :D

 

 

 

@edit:

 

Pausar um programa é dependente da implementação do sistema operacional. Assim, para usar o getch(), use o header <conio.h> em windows e <curses.h> em *nix.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

O while não resolve overflows. Em C, é preciso tratar casos de overflow especificamente, testando pela reação documentada oficialmente para cada implementação (O C em si define undefined behavior para o caso de overflow de inteiros). Fazer o teste acima não adianta em nada. Se quiser se prevenir "um pouco mais", pode usar long long int para armazenar a entrada. Uma versão simplista do programa que você quer é a seguinte:

 

 

#include <stdio.h>
#include <limits.h>

int main(void)
{
long long entrada = 0;

printf("\n\tDigite um inteiro (menor que %d): ", INT_MAX);
scanf("%lld", &entrada);

char *resultado = (entrada % 2 == 0) ? "par" : "impar";

printf("\n\tEntarda eh %s.\n\n", resultado);
}

 

Uma forma "correta" de se tratar o caso de erro (em que o valor digitado é maior que INT_MAX) é criar sua própria rotina de leitura e parsing, que lê dígito a dígito (com algo como fgets() ou, novamente, sua própria rotina de leitura de texto) e constrói o número de entrada, sempre verificando se, ao adicionar a próxima casa decimal (correspondente ao próximo dígito do texto fornecido como entrada) não causaria um overflow - e tratar o erro antes que ele aconteça.

 

Isto na verdade resolve outro problema da versão acima: o uso de scanf(). A função, embora reporte a ocorrência de erros, não permite que se detecte exatamente onde o erro ocorreu. Para códigos profissionais, onde o tratamento de erros deve possuir qualidade, isso é inaceitável. A rotina responsável pela leitura de texto deve tratar e reportar erros de maneira suficientemente completa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lord Evil ficou muito bem explicado, o system("PAUSE") realmente demora um pouco mais, apos pausar ele leva um tempinho ate aparecer aquela frase.

 

guidjos obrigado pela resposta, mas eu nao entendi nada, tem muita coisa q eu ainda nem vi, eu anotei o código e vou estudar esses comandos q você passou.

 

Ow vcs sabem de alguma boa fonte para eu estudar mais afundo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Um livro. A melhor forma de aprender C/C++ é lendo um livro. Não confie nesses tutoriais na internet porque a maioria esmagadora não é boa e dos que são bons 99% está em inglês e é de difícil entendimento.

 

 

Procure um livro que seja recomendado para iniciantes. O C Completo e Total não é recomendado para iniciantes.

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guidjos, ele pode usar fgets seguido de strtol (ou strtod, se for double) p/ fazer a conversão.

 

#include <error.h>
#include <stdlib.h>
#include <stdio.h>

int main() {
   char S[10];
   fgets(S, 10, stdin);
   long N = strtol(S);
   if (errno == ERANGE) {
       printf("%m\n");
       return 1;
  }
}

 

http://www.manpagez.com/man/3/strtol/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guidjos, ele pode usar fgets seguido de strtol (ou strtod, se for double) p/ fazer a conversão.

 

#include <error.h>
#include <stdlib.h>
#include <stdio.h>

int main() {
   char S[10];
   fgets(S, 10, stdin);
   long N = strtol(S);
   if (errno == ERANGE) {
       printf("%m\n");
       return 1;
  }
}

 

http://www.manpagez.com/man/3/strtol/

 

 

Agradeço muito pela colaboração,

mas olha.... eu acho q nao posso usar "fgets seguido de strtol" nao, mesmo pq nao faço ideia do q você ta falando :huh: , eu comecei a estudar ling.C esse semestre, to no primeiro ano da facul, não judia mais nao amigo, kkkkkkkkkkkk.

 

Seguinte, to entendendo ate agora, gostei muito da ajuda vou voltar mais vezes com outras duvidas, obrigado pessoal.

valew :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte tenho q fazer um algoritmo pra ler dois numeros inteiros, e depois somar, subtrair, multiplicar e dividir:

 

Dá olhada na minha lógica:

 

----------------------

// Seção de Declarações 
var
num1,num2 : inteiro
result : real
inicio
  // Seção de Comandos
  escreval("digite dois numeros inteiros = ")
  leia(num1,num2)
  result <- num1 + num2
  escreval("soma é = ",result)
  result <- 0
  result <- num1 - num2
  escreval("subtração é = ",result)
  result <- 0
  result <- num1 * num2
  escreval("multiplicação é = ",result)
  result <- 0
  se num2 > 0 entao
     result <- num1 / num2
     escreval("divisão é = ",result)
     senao
      	escreva("não existe valores para divisão por 0")
  fimse
fimalgoritmo

----------------------

 

Entao tentei usar o mínimo de variáveis, acredito q não dá pra usar menos q isso, dá???

 

To usando "result <- 0" para zerar algum valor armazenado no "resut" do código anterior, mas acho q não é necessário, ou é?

e usando uma estrutura de decisao caso o denominador seja zero, pq se não da erro de calculo, para avisar q não dá pra dividir por zero;

acho q isso, depois eu vo passar pra ling.C ai eu posto aqui

 

tenho mais uma duvida: eu declarei o resultado como float, por causa do resultado da divisao, so q nas outras operaçoes elas ficam com varios zeros ex: 4.000000 tem como tratar para parecer resultado inteiro?

 

valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal mudeia a estrutura, ao inves de utilizar "if" eu quero usar "while", para quando num2<=0 pedir pra digitar outro numero, e se num2>0 ai faz a divisao

só q tá dando erro, acho q o while ta errado... :(

 

 

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main(){
int num1, num2;
float result;
printf("\n digite dois n%cmeros inteiros = ",163);
scanf("%d%d%*c",&num1,&num2);
result = num1 + num2;
printf("\n A soma dos dois n%cmeros %c = %f",163,130,result);
result = num1 - num2;
printf("\n A subtra%c%co %c = %f",128,131,130,result);
result = num1 * num2;
printf("\n A multiplica%c%co %c = %f",128,131,130,result);
while(num2 <= 0) {
    	printf("\n N%co existe divis%co por 0, por favor informe outro valor = ",131,131);
    	scanf("%d",num2);

    	while(num2 > 0){
                   result = num1 / num2;
                   printf("\n A divis%co %c = %f",131,131,result);
                   }
}                    
_getch();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O while está dando erro pq está no lugar errado, coloca no inicio que fica certo, quanto a quantidade de zeros no float é só usar %.2f, que vai ficar com apenas dois zeros no final.

 

Eu faria assim, não sei se é a melhor forma, mas...

 

#include <stdio.h>
#include <conio.h>

main()
{

float num1, num2, result;

printf("\n Digite um n%cmeros inteiro: ",163);
scanf("%f%f",&num1,&num2);

    while (num1<=0 || num2<=0) {
          printf("\n Os n%cmeros devem ser maiores que ZERO: ",163);
          scanf("%f%f",&num1,&num2);
          }

result = num1 + num2;
printf("\n A soma dos dois n%cmeros %c = %.2f",163,130,result);

result = num1 - num2;
printf("\n A subtra%c%co %c = %.2f",135,198,130,result);

result = num1 * num2;
printf("\n A multiplica%c%co %c = %.2f",135,198,130,result);

result = num1 / num2;
printf("\n A divis%co %c = %.2f",131,130,result);

getch();
} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi obrigado Gr4v370, imaginei mesmo que havia escrito errado o while.

Mas dessa forma ainda nao consigo o resultado correto, por exemplo:

1)todo num1 pode ser <= 0

2)num2 tambem pode ser <= 0, exceto na divisão, pq não pode haver divisão por 0; (na verdade pode ser menor só não pode ser 0)

 

Entao eu pensei no while, para toda vez em que num2<=0 pedir pra digitar outro valor pra num2, mas só no caso da divisão. Por isso escrevi lá em baixo antes de fazer o calculo da divisao, só q dá erro, e nao sei resolver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

descobri pq tava dando erro

aqui oh:

 


while(num2 <= 0) {
printf("\n Nao existe divisao por 0, por favor informe outro valor = ");
[color="#FF0000"]scanf("%d",num2);[/color]
[color="#FF0000"]

[/color]

 

esqueci de por "&" antes de num2 hehehe mancada.

 

meu código ficou assim

 

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main(){
 //declaração de variaveis
 int num1, num2; //variaveis de entrada
 float result; //variavel de saida

 //comandos
 printf("\n digite dois numeros inteiros = ");
 scanf("%d%d%*c",&num1,&num2);

 //soma
 result = num1 + num2;
 printf("\n A soma dos dois numeros e = %f",result);

 //subtração
 result = num1 - num2;
 printf("\n A subtracao = %f ",result);

 //multiplicaçao
 result = num1 * num2;
 printf("\n A multiplicaçao e = %f",result);

 //divisão
 while(num2 == 0){
       printf("\n Nao existe divisao por 0, por favor informe outro valor = ");
       scanf("%d",&num2);
}
if (num2 != 0) {
  result = num1 / num2;
  printf("\n A divisao e = %f",result);
}
_getch();
}

 

Só q tá calculando errado quando o divido, por exemplo, 2 / 20 resultado da 0.00 e assim com todos quando o denominado é maior q o numerador, q será?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.