Jump to content

Ajuda


servn
 Share

Recommended Posts

Boa noite

Sou novo aqui, por isso antes de mais olá a todos.

Precisava de umas dicas. Tenho de fazer um programa básico em C, sem usar funções complexas, ou mais adiantadas, isto é só posso usar conhecimentos básicos.

Assim sendo, precisava de saber se me podem ajudar no modo de verificar 2 coisas acreca do que é inserido pelo utilizador:

1ª - verificar se o número é inteiro

2ª - verificar se é número, ou seja, se não é do tipo 12a3b

Agradecido pelas ajudas.

servn

Link to comment
Share on other sites

Qual o erro aqui:

#include <stdio.h>
#include <stdlib.h>
main()
{
     
      int cnt=0,n ;
               
      printf("Insira um inteiro,S para sair");
          
      while ((scanf("%d",&n)!=S)&&(cnt <4)){
      printf("n=%d\n",n);
     
      cnt=cnt+1;
      printf("Insira um inteiro,S para sair");
            }
      }
Link to comment
Share on other sites

Uma variável tem sempre um valor atribuído, quanto mais não seja aquilo a que chamamos de "lixo". Se queres verificar se o valor que inseriste pelo teclado é atribuído à variável 'n' no scanf, então tens é de verificar o valor devolvido por essa mesma função. Em caso de não conseguir fazer a atribuição correctamente, o scanf devolve 0. http://www.manpagez.com/man/3/scanf/

Link to comment
Share on other sites

Uma variável tem sempre um valor atribuído, quanto mais não seja aquilo a que chamamos de "lixo". Se queres verificar se o valor que inseriste pelo teclado é atribuído à variável 'n' no scanf, então tens é de verificar o valor devolvido por essa mesma função. Em caso de não conseguir fazer a atribuição correctamente, o scanf devolve 0. http://www.manpagez.com/man/3/scanf/

Ou seja, para o problema inicial de verificar se o utilizador inseria caracteres quando era pedido apenas números, pelo que diz nessa link, o scanf quando não consegue ler tudo, o que seria a situação pois não poderia atribuir caracteres a inteiros, devolveria o valor EOF. Assim sendo basta-me colocar um if para essa situação, certo?  ? ?

Link to comment
Share on other sites

Sim. Algo deste género:

#include <stdio.h>

int main(void) {
        int n, v;
        do {
                v=scanf("%d",&n);
                scanf("%*c");
        } while (v==0);
        printf("%d\n",n);
        return 0;
}

Assim não dá pois quando se coloca 123s, o scanf lê até ao s descartando-o, ou seja considera o nº 123, e a ideia será ele não considerá-lo por estar lá o caracter.

Link to comment
Share on other sites

Porque quando introduzes o caracter da 1ª vez, não introduzes 1 mas 2 caracteres: o caracter + '\n' (mudança de linha). Este '\n' fica armazenado no buffer do teclado e vai ser lido da próxima vez que o programa invocar uma função de leitura que use o teclado como dispositivo de entrada de dados (caso do scanf). Daí que essa situação aconteça e o programa não páre.

Link to comment
Share on other sites

A lógica não é essa, tens de utilizar os valores lógicos True ou False. Da maneira que tu tens, o ciclo só termina quando as 2 condições forem falsas (ou seja quando o 'repete' é igual a 'n' e a 'N' ao mesmo tempo), caso contrário aquele predicado resulta sempre num valor lógico True (verifica com uma tabela de verdade: http://pt.wikipedia.org/wiki/Tabela_verdade). Com o &&, ele termina mal uma das condições seja falsa, ou seja, mal o 'repete' tenha o valor 'n' ou 'N'.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.