Ir para conteúdo
Fórum Script Brasil
  • 0

Reconhecer Que é Letra


RenatoMejias

Pergunta

Desde que comecei a programar em C, eu tenho essa duvida, nenhum professor meu conseguiu responder, então resolvi fazer ela aqui nesse fórum. Tem como o programa reconhecer que foi digitado uma letra ao invés de um número???

Quando você pede pra ler um número e digita uma letra, ele dá um pau feio no compilador, então eu queria saber se tem algum jeito do compilador reconhecer se foi digitado uma letra num campo de números.

Uma vez eu pesquisei o assunto e descobrir a biblioteca ctype.h e ela tem uma função que se chama isnum, só que o parâmetro dela é char e não é o que eu quero. alguém sabe alguma coisa a respeito disso?

Link para o comentário
Compartilhar em outros sites

24 respostass a esta questão

Posts Recomendados

  • 0

ele deve estar querendo dizer o seguinte, tipow voce faz um programa e pede para o usuario digitar um numero qualquer, para fazer parte de uma soma, por exemplo, mas se digitar um caracter, da pau no programa.. eu tambem queria saber, como se identifica se é numero eu letra, a duvida tambem é minha!!

Link para o comentário
Compartilhar em outros sites

  • 0
ele deve estar querendo dizer o seguinte, tipow voce faz um programa e pede para o usuario digitar um numero qualquer, para fazer parte de uma soma, por exemplo, mas se digitar um caracter, da pau no programa.. eu tambem queria saber, como se identifica se é numero eu letra, a duvida tambem é minha!!

Sim, isso eu entendi. Porém, existem diferentes maneiras de se "entrar" com dados no sistema. Pode ser por modo texto (utilizando scanf(), getchar(), etc. por exemplo) ou via janelas (GTK, wxWidgets, Win32 API, etc., por exemplo). É isso que ele tem que explicitar para poder obter uma ajuda satisfatória.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Talvez isso resolva seu problema:

#include <iostream.h>
#include <conio.h>
#include <ctype.h>

void main(void)
{
	int a;
	char teste;
	clrscr();
	cout<<"Digite uma letra: ";
    cin>>teste;
	if(isalpha(teste)==0)
    cout<<"é numero";
	else
    cout<<"é letra";
	getch();
}

Ele vai verificar se o caracter digitado é letra ou numero e vai dizer o q é....utilizei o isalpha da biblioteca ctype.

No seu caso, acho que seria necessario aplicar o numero digitado do usuario para uma var do tipo char, fazer a verificação e passar esse valor para int ou coisa assim.

+/- isso, se você conseguir posta ai.

Link para o comentário
Compartilhar em outros sites

  • 0

Então, quando eu me refiro a uma entrada de números, pode ser por scanf ou cin, tanto faz, se você colocar uma letra num campo de número ele dá pau no compilador. A função isalpha do ctype.h eu já conhecia, mas ela pede entrada de um char, então se você quiser fazer operações matemáticas com esse "número", não será possivel porque ele é do tipo char. E a função isnum da ctype.h tambem pede a entrada de um char.

Link para o comentário
Compartilhar em outros sites

  • 0

Não sei se existe alguma funcão que teste se a tecla digitada é numerica ou não, porem, eu acho o seguinte, pra poder testar se é numerica ou não seria necessario guardar a tecla digitada em uma variavel, como o int ou qualquer outro tipo de variavel iria travar se você digitasse uma letra o ideal é você aplicar o valor em um char....ai você verifica com o isnum ou isalpha se é letra ou não, se for numero você converte o char pra uma string utilizando se não me engano o strtoint...... tem um comentario sobre isso em outro tópico aki.

acho q é o unico jeito, qualquer coisa se você encontrar uma função para isso coloca ai no forum....

Link para o comentário
Compartilhar em outros sites

  • 0

Eu uso como compilador o Borland C++ 3.1 e o Turbo C. Aquela função StrToInt, itoa não existe nesses compiladores. A sua idéia faz sentido, mas não funciona, o uncio jeito de conversão que eu conheço é o cast que pode converter um tipo num outro, porem se você converter um char num int você não vai ter o valor digitado, e sim o valor ASCII da tecla digitado.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu to usando o borland C++ 3.0 tb, eu tentei fazer aki um pograminha basico, q verifica se é numero, se for joga no int e mostra olha:


#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>

void main (void)
{
	char *a;
	int b;
	clrscr();
	cout<<"Digite um numero: ";
   cin>>a;
	if(isalpha(*a)==0)
	{
  b=atoi(a);
  cout<<b;
	}
	else
  cout<<"Digite um valor valido!!!";
	getch();
}

Se você definir o char como ponteiro funciona. acho q isso resolve, só da umas ajeitada usando while e tal e já eras.

Ve se é o q você queria, qualquer coisa posta ai....to aprendendo com isso tb, hehe biggrin.gif

Link para o comentário
Compartilhar em outros sites

  • 0

e ai cara....talvez isso possa te ajudar....

qualquer dúvida estamos ai!!!

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

int main()
{
    int i=0,c;
    char a[2];
    printf("Digite o caracter a ser verificado:\n");
    fgets(a,2,stdin);
    a[1]='\0';
    if((a[0]>='0')&&(a[0]<='9'))
    {
        printf("E um numero\n");
        c=atoi(a);
        printf("Valor digitado e: %i\n",c);
    }
    else
        printf("E um caracter\n"); 
    getch();
}

Link para o comentário
Compartilhar em outros sites

  • 0

Essas são algumas formas de se proteger contra entradas inválidas.

Primeiro em C:

#include <stdio.h>

int main() {
    
    int teste = 0;
    
    while(!scanf ("%d", &teste)) {
        while(getchar() != '\n');
        printf("Entrada invalida.\n\n");
    }
    printf("Voce escreveu: %d\n",  teste);
    
    return 0;    
}
E agora, um exemplo em C++:
#include <iostream>
#include <string>
using namespace std;

int main() {
    
    int teste = 0;
    
    while(!(cin >> teste)) {
        cin.clear();
        cin.ignore(INT_MAX, '\n');
        cout << "Entrada invalida." << endl << endl;
    }
    
    cout << "Voce digitou: " << teste << endl;
    
    system("pause");
    return 0;    
}

Note que em C++, ele verifica até se o numero é muito grande.

O bom também é que funciona pra qualquer tipo. wink.gif

[]'s

iSoron.

Link para o comentário
Compartilhar em outros sites

  • 0

Então oCx, eu programo nas duas linguagens, em C e C++, (na minha opinião, enquanto você não aprende a orientar a objeto, você está programando em C), eu testei esse programa em C e deu certo. Achei legal a forma que o iSoron usou o scanf dentro de um while com operador NOT, confesso que nunca pensei nisso, muito inteligente, parabéns iSoron. Só uma coisinha, faltou você colocar .h nas bibliotecas em C++

#include <iostream>

#include <string>

using namespace std;

int main() {

 

  int teste = 0;

 

  while(!(cin >> teste)) {

      cin.clear();

      cin.ignore(INT_MAX, '\n');

      cout << "Entrada invalida." << endl << endl;

  }

 

  cout << "Voce digitou: " << teste << endl;

 

  system("pause");

  return 0;   

}

#include <iostream.h>
#include <string.h>
using namespace std;

int main() {
   
   int teste = 0;
   
   while(!(cin >> teste)) {
       cin.clear();
       cin.ignore(INT_MAX, '\n');
       cout << "Entrada invalida." << endl << endl;
   }
   
   cout << "Voce digitou: " << teste << endl;
   
   system("pause");
   return 0;    
}

Pequenos detalhes...

Link para o comentário
Compartilhar em outros sites

  • 0

Eu testei esse programa em C++ do iSoron e deu erro, nessa linha


using namespace std;

Da erro de declaração, então eu consertei esse using, eu creio que ele quis dizer unsigned, mas mesmo assim o erro continua. FALOU...

Link para o comentário
Compartilhar em outros sites

  • 0
Só uma coisinha, faltou você colocar .h nas bibliotecas em C++

Na verdade não, Renato. A especificação ANSI-C++ mudou a forma como os cabeçalhos são inclusos. Basicamente, ela diz:

1. Os cabeçalhos padrões não precisam mais da terminação ".h".

2. Ao se utilizar cabeçalhos de C em C++, deve-se adicionar a letra 'c' antes. Assim, "stdio.h" vira "cstdio".

Mais sobre o assunto:

http://www.cplusplus.com/doc/ansi/hfiles.html

http://www.open-std.org/jtc1/sc22/wg21/doc.../2004/n1569.htm

Da erro de declaração, então eu consertei esse using, eu creio que ele quis dizer unsigned, mas mesmo assim o erro continua.

Eu quis dizer using mesmo. O seu compilador deu problema porque, ou está sendo usado como C, ao invés de C++, ou não segue os padrões ANSI-C++. Neste caso, então, eu sugiro trocar de compilador. wink.gif

Se quiser ler mais:

http://www.cplusplus.com/doc/tutorial/tut5-2.html

[]'s

iSoron.

Link para o comentário
Compartilhar em outros sites

  • 0

Realmente!!! Eu teste ele em Borland C++ 3.1 e deu aqueles erros que eu falei, então eu teste em Dev C++ 4.9.9.2 e funcionou daquele jeito que o iSoron falou. Acho que vou mudar mesmo de compilador...

Link para o comentário
Compartilhar em outros sites

  • 0

E acho melho caro amigo, você usar um laço de segurança, ou seja um while / do while. Assim se o usuário teclar um caracter em vez de um número, o programa pd imprimir uma mensagem do tipo: "Usuário fugiu da Escola, Digite apenas números". Veja abaixo um programinha que exemplifica.

#include <stdio.h>

#include <stdlib.h>

// Recebe um número inteiro num tal que, 1 < num < 12;

// Imprime na tela o nome do mês associado a esse número

int main()

{

int num;

printf("Digite um numero inteiro, positivo entre 1 e 12:\n");

scanf("%d", &num);

// Laço de segurança contra usuários estúpidos

while (num < 1 || num > 12){

printf("Fugiu da escola ?!?\n");

printf("Digite um numero de 1 a 12!\n");

scanf("%d", &num);

}

switch(num){

case 1:{

printf("Janeiro\n\n");

break;

}

case 2:{

printf("Fevereiro\n\n");

break;

}

case 3:{

printf("Março\n\n");

break;

}

case 4:{

printf("Abril\n\n");

break;

}

case 5:{

printf("Maio\n\n");

break;

}

case 6:{

printf("Junho\n\n");

break;

}

case 7:{

printf("Julho\n\n");

break;

}

case 8:{

printf("Agosto\n\n");

break;

}

case 9:{

printf("Setembro\n\n");

break;

}

case 10:{

printf("Outubro\n\n");

break;

}

case 11:{

printf("Novembro\n\n");

break;

}

case 12:{

printf("Dezembro\n\n");

break;

}

default: printf("Mês Invalido\n");

} // por quê essa instrução NUNCA será executada?

system("PAUSE");

return 0;

}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...