FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 754.098 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 12-04-2004, 21:27   #1 (permalink)
ffugita
Highlander
 
Registrado em: Nov 2002
Localização: Anywhere
Mensagens: 10.054
Reputação: 0 ffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputação
Padrão Help em exercício de "C"

Citação:
O programa deverá fazer o seguinte:

1- Pedir que o usuário digite alguns números maiores que zero.

2- O usuário deve digitar pelo menos um número válido

3- Caso o usuário digite algo que não seja um número ou seja um número negativo então o programa deverá informá-lo e pedir um novo número

4- Quando o usuário digitar o número 0 o programa deve escrever "O maior numero digitado foi x. Por favor, pressione qualquer tecla para terminar o programa" no console e aguardar até que o usuário aperte alguma tecla. Quando o usuário apertar alguma tecla o programa deve encerrar.
O problema está sendo verificar o que o usuario digitou (se é numero ou não). Sugerirarm usar "scanf", mas dá pau se o usuario digitar algo que não seja numero. O problema do programa portanto está sendo o item 3, que com meus "incriveis" conhecimentos de C nao sei resolver...

Alguem tem um help?
ffugita está offline   Responder com Quote
Antigo 13-04-2004, 0:16   #2 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Usa a função isdigit

Código:
#include <stdio.h> #include <ctype.h> main() { int numero; printf("Digite um numero: "); scanf("%d", &numero); if(!isdigit(numero)) printf("Numero invalido\n"); }
kao00 está offline   Responder com Quote
Antigo 13-04-2004, 10:32   #3 (permalink)
Lgub
Super Participante
 
Avatar de Lgub
 
Registrado em: Dec 2001
Mensagens: 937
Reputação: 22 Lgub está indo no caminho certo
Padrão

As isdigit funciona com caracter.
o melhor nesse caso seira usar a gets(), usar a funcção atoi() para converter para numero, se ela retorna-se erro é porque não é valido, e depois verifica se é maior que zero.
__________________
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
Lgub está offline   Responder com Quote
Antigo 13-04-2004, 10:51   #4 (permalink)
ffugita
Highlander
 
Registrado em: Nov 2002
Localização: Anywhere
Mensagens: 10.054
Reputação: 0 ffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputação
Padrão

Citação:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
int num=2,maior=0;
char lido[5];
while (num!=0)
{
printf("Digite um numero maior que '0' ou '0' para termina-lo:\n");
gets(lido);
if(!isdigit(lido))
printf("Numero invalido\n");
else
{
num=atoi(lido);
if (num>maior)
maior=num;
}
}
if (maior==0)
printf("Voce nao digitou um numero maior que '0'.\n");
else
printf("O maior numero digitado foi %d.\n",maior);
printf("Pressione qualquer tecla para terminar.\n");
getchar();
return 0;
}
Pensei em algo assim, mas dá pau, pois quando se digita uma letra, acaba saindo do while e não mostra a mensagem de erro. Vou tentar a segunda dica...
ffugita está offline   Responder com Quote
Antigo 13-04-2004, 11:04   #5 (permalink)
Lgub
Super Participante
 
Avatar de Lgub
 
Registrado em: Dec 2001
Mensagens: 937
Reputação: 22 Lgub está indo no caminho certo
Padrão

Da uma olhada nisso,:

Código:
#include <stdio.h> #include <stdlib.h> void main() { char temp[50]; long num; printf("Digite algo:\n"); gets(temp); if((num=atol(temp))>0) printf("VC digitou o numero:%ld",num); else printf("\no que vc digitou nao e valido %s",temp); }
Só que não da pra indentificar se o cara digita 0, pois a função retorna 0 caso ela não consiga retornar.
__________________
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
Lgub está offline   Responder com Quote
Antigo 13-04-2004, 11:54   #6 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Citação:
Postado Originalmente por Lgub
As isdigit funciona com caracter.
Putz, é mesmo cara. Que mancada ops:

Eu tô acostumado a usar a função isdigit com strings em C++ e nem me toquei.
kao00 está offline   Responder com Quote
Antigo 13-04-2004, 11:55   #7 (permalink)
jqueiroz
Highlander
 
Avatar de jqueiroz
 
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778 jqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputação
Padrão

eu faria assim:

Código:
#include <stdio.h> #include <types.h> #include <string.h> int le_numero() { char inp[16]; int i; int inp_ok = 0; while( ! inp_ok ) { scanf( "%15s", inp ); for( i = 0, inp_ok = 1; inp[i] != '\0'; i++ ) if( ! isdigit( inp[i] ) ) { inp_ok = 0; break; } if( ! inp_ok ) { printf "Por favor digite apenas números.\n"; continue; } } return atoi(inp); } int main(ac,av) int ac; char *av[]; { int max = 0; int n; do { n = le_numero(); if( n > max ) max = n; } while( n != 0 ); printf "O maior dos números é %d", max ); }
Agora, revendo o código, eu notei que se a pessoa digitar "" (vazio), vai aceitar como se a pessoa tivesse digitado "0"... fica então a questão: como diferenciar o vazio do "0"?

PS: A sintaxe do "scanf" é essa mesma? "%15s" para ler só 15 caracteres?

PS2: Eu nunca gostei de usar a família scanf, sempre preferi usar a gets(). Mas recentemente me chamaram a atenção que, ao contrário da scanf, a gets() não tem como vc limitar a quantidade de caracteres digitados, expondo seu programa a risco de buffer overflow.

PS3: Ele vai aceitar "12", mas não " 12" nem "12 " (com espaços). A modificação pra passar a aceitar é simples...
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns
jqueiroz está offline   Responder com Quote
Antigo 13-04-2004, 12:48   #8 (permalink)
Lgub
Super Participante
 
Avatar de Lgub
 
Registrado em: Dec 2001
Mensagens: 937
Reputação: 22 Lgub está indo no caminho certo
Padrão

Citação:
Postado Originalmente por jqueiroz
eu faria assim:

[code]
#include <stdio.h>
#include <types.h>
#include <string.h>

int le_nu...
Só uma obs, no seu scanf faltou um & antes da variavel.
Editado: Esquece é uma Struing... Não olhei o seu tipo

FAlou.
__________________
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
Lgub está offline   Responder com Quote
Antigo 14-04-2004, 1:12   #9 (permalink)
Gaia
Newbie
 
Registrado em: Apr 2004
Localização: No mundo
Mensagens: 24
Reputação: 0 Gaia está indo no caminho certo
Padrão

Cara eu acho que vc pode fazer isso usando o código ASCII

Um exemplo meio porco


if(caracter digitado = CodigoAscii)
{

//execute

}

É apenas uma sugestão, pois estou iniciando na linguagem agora e estou lendo um tuto que tem essa funçao ASCII
Gaia está offline   Responder com Quote
Antigo 14-04-2004, 13:53   #10 (permalink)
ffugita
Highlander
 
Registrado em: Nov 2002
Localização: Anywhere
Mensagens: 10.054
Reputação: 0 ffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputaçãoffugita tem uma fabulosa reputação
Padrão

Opa, vou dar uma testada nos códigos....
Acho que peguei a ideia da coisa... (espero...)

Vamos ver se agora consigo eliminar os bugs e ver se a coisa sai...


ps: Como colocar texto indentado no forum?
ffugita está offline   Responder com Quote
Antigo 14-04-2004, 14:37   #11 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Usa as tags
Código:
e
kao00 está offline   Responder com Quote
Antigo 14-04-2004, 15:24   #12 (permalink)
jqueiroz
Highlander
 
Avatar de jqueiroz
 
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778 jqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputação
Padrão

Citação:
Postado Originalmente por Gaia
Cara eu acho que vc pode fazer isso usando o código ASCII

Um exemplo meio porco

if(caracter digitado = Codi...
Dá muito certo não... no caso, ele tem que testar algarismos, e são 10 ('0' a '9'), imagina se tivesse que testar alfabético (26 letras maiúsculas, 26 minúsculas) ou alfanumérico (as 52 letras maiúsculas/minúsculas, mais 10 algarismos)... seria IF que não acaba mais...

por isso que no C tem as funções de tipo de caracter:

int isdigit( const char c ) - retorna verdadeiro se o caracter for um algarismo;

int isalpha( const char c ) - retorna verdadeiro se for alfabético;

int isalnum( const char c ) - retorna verdadeiro se for alfanumérico;

int isspace( const char c ) - retorna verdadeiro se for um caracter de separação de palavras (espaço, newline, carriage return, tab, etc);

int ispunct( const char c ) - retorna verdadeiro se for um caracter de pontuação ("!", ".", ",", aspas, etc.); e

int isprint( const char c ) - retorna verdadeiro se for um caracter "imprimível", ou seja, não seja um código de controle ASCII.

Tem outros testes, mas esses são os mais usados. São todos macros, vc inclui eles com a linha

#include <types.h>
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns
jqueiroz está offline   Responder com Quote
Antigo 17-04-2004, 14:52   #13 (permalink)
Dabel
Super Participante
 
Registrado em: Mar 2003
Localização: São Paulo
Mensagens: 533
Reputação: 19 Dabel está indo no caminho certo
Padrão

Citação:
Postado Originalmente por Gaia
Cara eu acho que vc pode fazer isso usando o código ASCII

Um exemplo meio porco


if(caracter digitado = Codi...
Eu entendi o que o Gaia quer dizer e faz sentido. Não é necessário testar um por um. Ele pode pegar blocos da tabela ASCII. Para facilitar, segue um programinha q mostra os caracteres e seus correspondentes da tabela ASCII:

Código:
#include <stdio.h> int main(int argc, char *argv[]) { int i=0; for(i=0;i<=254;i++) { printf("O codigo ASCII de %c eh %d\n",i,i); } return 0; }
Como vcs notarão, os números (de 0 a 9) correspondem do código 48 ASCII até o 57. Vejam:

Código:
Decimal ASCII 0 48 1 49 2 50 3 51 4 52 5 53 6 54 7 55 8 56 9 57
Posto isso, o seu programa pode testar se o que foi digitado está dentro desse intervalo da tabela ASCII, assim, qualquer outra coisa, seja qual for, seria recusada.
Código:
if((ascii(caracter)<48)||(ascii(caracter)>57)) { // não vale... }
Sinceramente não sei como funciona essa função ASCII em C, mas já fiz algo em VB exatamente dessa forma.
__________________
Il mondo degli altri
Che non son con me
Ma non me ne importa
Se sono con te
Dabel está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 8:54.