servn Posted November 8, 2009 at 11:34 PM Report Share #295195 Posted November 8, 2009 at 11:34 PM 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 More sharing options...
Baderous Posted November 9, 2009 at 12:13 AM Report Share #295203 Posted November 9, 2009 at 12:13 AM http://forum.zwame.pt/showthread.php?t=493747 Link to comment Share on other sites More sharing options...
servn Posted November 9, 2009 at 12:36 AM Author Report Share #295207 Posted November 9, 2009 at 12:36 AM 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? Link to comment Share on other sites More sharing options...
Baderous Posted November 9, 2009 at 12:45 AM Report Share #295209 Posted November 9, 2009 at 12:45 AM A resposta está lá: http://forum.zwame.pt/showpost.php?p=5502026&postcount=5 Link to comment Share on other sites More sharing options...
servn Posted November 10, 2009 at 04:02 PM Author Report Share #295435 Posted November 10, 2009 at 04:02 PM 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 More sharing options...
Baderous Posted November 10, 2009 at 07:30 PM Report Share #295478 Posted November 10, 2009 at 07:30 PM 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. Link to comment Share on other sites More sharing options...
servn Posted November 10, 2009 at 09:32 PM Author Report Share #295494 Posted November 10, 2009 at 09:32 PM 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? Link to comment Share on other sites More sharing options...
Baderous Posted November 10, 2009 at 09:44 PM Report Share #295495 Posted November 10, 2009 at 09:44 PM 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 More sharing options...
servn Posted November 10, 2009 at 10:04 PM Author Report Share #295499 Posted November 10, 2009 at 10:04 PM 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 More sharing options...
Baderous Posted November 10, 2009 at 10:30 PM Report Share #295506 Posted November 10, 2009 at 10:30 PM 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; } Link to comment Share on other sites More sharing options...
servn Posted November 10, 2009 at 11:06 PM Author Report Share #295514 Posted November 10, 2009 at 11:06 PM 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 More sharing options...
Baderous Posted November 10, 2009 at 11:49 PM Report Share #295516 Posted November 10, 2009 at 11:49 PM Ah assim já tem de ser de outra maneira. Vê aqui: http://forum.zwame.pt/showthread.php?t=493747 Link to comment Share on other sites More sharing options...
servn Posted November 11, 2009 at 09:08 PM Author Report Share #295690 Posted November 11, 2009 at 09:08 PM 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. Link to comment Share on other sites More sharing options...
Baderous Posted November 11, 2009 at 09:37 PM Report Share #295706 Posted November 11, 2009 at 09:37 PM 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 More sharing options...
servn Posted November 11, 2009 at 10:01 PM Author Report Share #295714 Posted November 11, 2009 at 10:01 PM 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? Link to comment Share on other sites More sharing options...
Baderous Posted November 11, 2009 at 10:34 PM Report Share #295731 Posted November 11, 2009 at 10:34 PM Quanto ao buffer podes ver aqui como limpar: http://wiki.portugal-a-programar.pt/dev_geral:c:scanfparastrings Se esse scanf devolver o valor 2 quer dizer que fez 2 atribuições correctamente (isto tirando aquele pormenor do "123s"). Link to comment Share on other sites More sharing options...
servn Posted November 11, 2009 at 10:51 PM Author Report Share #295735 Posted November 11, 2009 at 10:51 PM 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ê??? Link to comment Share on other sites More sharing options...
Baderous Posted November 11, 2009 at 10:56 PM Report Share #295736 Posted November 11, 2009 at 10:56 PM A condição tem de ser com &&. Link to comment Share on other sites More sharing options...
servn Posted November 11, 2009 at 11:03 PM Author Report Share #295741 Posted November 11, 2009 at 11:03 PM 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 ?? ? Link to comment Share on other sites More sharing options...
Baderous Posted November 11, 2009 at 11:13 PM Report Share #295745 Posted November 11, 2009 at 11:13 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now