• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

servn

Ajuda

21 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela dica, mas não ajuda.

O problema de se é inteiro ou não resolvi, agora o verificar se tem caracteres ou não é que é pior.

Alguém dá uma dica?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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");
            }
      }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O erro está no scanf, estás a ler bem o inteiro mas depois estás a comparar o valor retornado pelo scanf com uma "coisa" a que chamas S.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois detectei o erro e já resolvi.

Será que me podes dizer qual é o código para verificar se uma variável não tem valor atribuído?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?  :eek: :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa noite

Alguém me explica porque é que numa situação destas:

printf("Quer continuar a correr o programa? S/N\n");

scanf("%c",&repete);

o programa não pára quando está em execução?

Isto num While.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois é, nunca me lembraria disso. Obrigado por todas as ajudas que me tens dado.

Já agora e não querendo ser chato, mesmo sendo :(

Como posso saber se ficaram valores no buffer?

Ou seja se usar

scanf("%d%c",a,b)

como posso saber se b ficou com valor, pois as variáveis têm sempre valor certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que consegui resolver esse problema com muita dor de cabeça, mas prontos.

while (repete!='N' || repete!='n') {
}

qual o erro nisto?

A ideia é correr o ciclo mais do que 1 vez com resposta tipo S\N, mas não me aceita quando coloco as duas hipóteses para o N (N ou n), só com uma delas dá.

Porquê???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois tem, mas não entendo porquê, qual a lógica:

Enquanto repete igual a N e repete igual a n.

Assim parece que para prosseguir tinha de ter as duas com aquele formato, que estranho.

Só acontece em C ?? :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois é.

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

/* --------------PROGRAMA-------------------------------------------------------------        */
int main()
{

char repete;  
/* repete - variável que vai tomar o valor da resposta para se repetir o programa ou não      */

while (repete!='N' && repete!='n'){                                           /* ---- 1 ----- */

char c;
/* c - caracteres que possam estar nos valores introduzidos */

int enter,numero;
/* enter - Variável que vai adquirir o código do caracter que vem a seguir ao último dado 
           inserido pelo utilizador. 
   numero - inteiro inserido pelo utilizador */

int digitos=0,soma=0, resto,letras=0;
/* digitos - numero de digitos do inteiro
   resto - resto da divisão do numero por 10 de modo a retirar os digitos da sua respectiva 
           posição, a contar da direita para a esquerda
   soma - soma do produto dos digitos pela sua posição
   letras - variável que vai tomar um valor quando se verificar se o utilizador inseriu 
            caracteres                                                                        */


printf("Escreva um numero inteiro positivo (sem letras nem espacos).\n");   
scanf("%d%c",&numero,&c);
resto=numero;

enter=(int) c;         
                       /*                               */
                                                                             /* ---- 2 ----- */
               if(enter!= 10)      /*Verifica se é a tecla Enter, ou seja, se não inseriu   */
                     letras=2;      /*nenhum caracter.                                       */  
               else{
                     letras=1;           
                     }                                                           
               if (letras!=1){      /*Se inseriu é avisado de que não pode    */
                  printf("Deve inserir apenas numeros inteiros positivos sem caracteres nem espacos.\n");
                             } 
               else{
                   
                   if(numero<=999999999){                                   /* ---- 3 ----- */
                             while(resto!=0) {
                                 resto=resto/10;
                                 digitos=digitos+1;
                                    }  
                                                                                                                     
                             while (digitos!=0) {
                                                 resto=numero%10;
                                                 soma=soma+resto*digitos;
                                                 numero=numero/10;
                                                 digitos=digitos-1;  
                                                 }
     printf("A soma dos produtos dos seus digitos pelas respectivas posicoes que ocupam e: %d\n",soma);
                                      }
                                                                           /* ---- 4 ----- */
                    else
                    printf("Insira um numero com menos de 10 digitos?\n");
                    }              
                                                                           
     printf("Quer continuar a correr o programa? S/N\n");
     scanf(" %c",&repete);

     }
     printf("Obrigado pelo tempo disponibilizado.\n");
     system("pause");
     return 0;
}

Porque é que quando se insere

aws123

o programa repete os printf??? e não me dá o printf final?

0

Partilhar esta mensagem


Link 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