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 759.307 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-2009, 15:04   #1 (permalink)
tdz
Super Participante
 
Avatar de tdz
 
Registrado em: Feb 2008
Mensagens: 522
Reputação: 9 tdz possui ótimo potencial
Padrão Ler Números em sequência em Linguagem C

Ola a todos

Gostaria de ler uma sequencia de Números que o usuário digita-se, por exemplo, nº agência de um banco:

Digite o Número da Conta: 9687-3 (enter)

mais com a linha abaixo, não consigo fazer dessa forma, apenas funciona se o usuário digitar um número e apertar enter, outro número enter....

Citação:
printf("Digite o Número da Conta");
scanf("%d%d%d%d-%d, &a, &b, &c, &d, &e);
Como faço para ler os números no formato que desejo ?

Abraços
__________________
Athlon XP 1700 +
Mobo: PCchips 810LR
HD: Samsung 40 Gb
768mb ram ( 1x256mb, 1x512mb)
Arch Linux + xfce4

Trekking Cohab II - São Paulo - Brasil
http://trilhastdz.multiply.com/
tdz está offline   Responder com Quote
Antigo 12-04-2009, 18:58   #2 (permalink)
intruso
Tô em todas
 
Avatar de intruso
 
Registrado em: Apr 2002
Localização: Paulista/PE
Mensagens: 1.642
Reputação: 525 intruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputação
Padrão

leia como string o numero da conta, como número fica dificil por causa do "-".

Depois que ler como string, fica fácil converter, se precisar.
__________________
Dê uma lida:
Eu não dou o peixe, ensino a pescar.

Meu Blog.
intruso está offline   Responder com Quote
Antigo 12-04-2009, 20:02   #3 (permalink)
tdz
Super Participante
 
Avatar de tdz
 
Registrado em: Feb 2008
Mensagens: 522
Reputação: 9 tdz possui ótimo potencial
Padrão

Obrigado intruso pela resposta !

Mais depois eu preciso passar para numeros inteiros, pois haverá calculo com o numero ! como faço isso ?

Abraços
__________________
Athlon XP 1700 +
Mobo: PCchips 810LR
HD: Samsung 40 Gb
768mb ram ( 1x256mb, 1x512mb)
Arch Linux + xfce4

Trekking Cohab II - São Paulo - Brasil
http://trilhastdz.multiply.com/
tdz está offline   Responder com Quote
Antigo 13-04-2009, 2:00   #4 (permalink)
mcv
Veterano
 
Avatar de mcv
 
Registrado em: Jun 2006
Localização: Brasil
Mensagens: 1.212
Reputação: 20 mcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todos
Padrão

Pode usar atoi.
mcv está offline   Responder com Quote
Antigo 13-04-2009, 13:07   #5 (permalink)
help_service
Membro Senior
 
Avatar de help_service
 
Registrado em: Nov 2008
Localização: RS-Brasil
Mensagens: 191
Reputação: 8 help_service está indo no caminho certo
Padrão

Citação:
Postado Originalmente por tdz Ver Mensagens
Ola a todos

Gostaria de ler uma sequencia de Números que o usuário digita-se, por exemplo, nº agência de um banco:

Digite o Número da Conta: 9687-3 (enter)

mais com a linha abaixo, não consigo fazer dessa forma, apenas funciona se o usuário digitar um número e apertar enter, outro número enter....



Como faço para ler os números no formato que desejo ?

Abraços
Como já falaram tem que ler uma string, porém atoi colocará em 1 variável inteira os números da string, pelo que percebi tu lê vários inteiros, ou seja teria que passar para inteiro caracter-por-caracter.
Se for o caso deve ter uma função que faça isso, mas quando eu também deparei com um problema semelhante criei uma função para essa conversão, nada muito complicado só um pouco de lógica binária e uma tabela ASCII.
espero respostas, flw!
help_service está offline   Responder com Quote
Antigo 13-04-2009, 14:33   #6 (permalink)
tdz
Super Participante
 
Avatar de tdz
 
Registrado em: Feb 2008
Mensagens: 522
Reputação: 9 tdz possui ótimo potencial
Padrão

Citação:
Postado Originalmente por help_service Ver Mensagens
Como já falaram tem que ler uma string, porém atoi colocará em 1 variável inteira os números da string, pelo que percebi tu lê vários inteiros, ou seja teria que passar para inteiro caracter-por-caracter.
Se for o caso deve ter uma função que faça isso, mas quando eu também deparei com um problema semelhante criei uma função para essa conversão, nada muito complicado só um pouco de lógica binária e uma tabela ASCII.
espero respostas, flw!
Exatamente eu preciso dos números separados.

Por exemplo:

Digite o Ano de Nascimento: 1985 (enter)

preciso que o a=1, b=9, c=8, d=9

Abraços
__________________
Athlon XP 1700 +
Mobo: PCchips 810LR
HD: Samsung 40 Gb
768mb ram ( 1x256mb, 1x512mb)
Arch Linux + xfce4

Trekking Cohab II - São Paulo - Brasil
http://trilhastdz.multiply.com/
tdz está offline   Responder com Quote
Antigo 13-04-2009, 16:28   #7 (permalink)
br_branco
Membro Senior
 
Registrado em: Jan 2008
Mensagens: 342
Reputação: 12 br_branco Tem uma excelente energiabr_branco Tem uma excelente energiabr_branco Tem uma excelente energia
Padrão

Veja se você consegue entender esse código:
Código:
#include<stdio.h> int main(){ char c[10]; int i; printf("Digite o numero da conta: "); gets( c ); for(i=0;i<10;i++) { if(c[i]>47 && c[i] <58) printf( "Digito%d: %c\n",i,c[i] ); } return 0; }
Depois poste que tipo de conta você pretende fazer com o numero.
br_branco está offline   Responder com Quote
Antigo 13-04-2009, 16:44   #8 (permalink)
tdz
Super Participante
 
Avatar de tdz
 
Registrado em: Feb 2008
Mensagens: 522
Reputação: 9 tdz possui ótimo potencial
Padrão

Ola a todos

Não entendi o seguinte.

Código:
gets(c) /* le a string e armazena em c é isso ?*/ char s[10] /* seria para a string ficar com no máximo 10 caracteres ? */ if(c[i]>47 && c[i] <58) /* não entendi a variavel c[i]*/
Meu algoritmo esta aqui, só esta faltando o fato de ter que digitar o ano de nascimento número por número:

Código:
#include <stdio.h> #include <ctype.h> main() { int a,b,c,d,s; float r; do { printf("Digite o Ano de Nascimento: "); scanf("%d %d %d %d", &a, &b, &c, &d); s=a+b+c+d; r=s%5; if(r==0) puts("Timido"); if (r==1) puts("Sonhador"); if (r==2) puts("Paquerador"); if (r==3) puts("Atraente"); if (r==4) puts("Irresistivel"); puts("Deseja Fazer Nova Consulta ? S/N "); } while(toupper(getch()) != 'N'); }
__________________
Athlon XP 1700 +
Mobo: PCchips 810LR
HD: Samsung 40 Gb
768mb ram ( 1x256mb, 1x512mb)
Arch Linux + xfce4

Trekking Cohab II - São Paulo - Brasil
http://trilhastdz.multiply.com/
tdz está offline   Responder com Quote
Antigo 13-04-2009, 19:12   #9 (permalink)
br_branco
Membro Senior
 
Registrado em: Jan 2008
Mensagens: 342
Reputação: 12 br_branco Tem uma excelente energiabr_branco Tem uma excelente energiabr_branco Tem uma excelente energia
Padrão

1º sim é isso
2º sim no maximo 10 //se quiser pode almentar
3º uma string é compasta por varios "chars" e terminada com o char "\0", cada "char" é equivalente a um numero na tabela "asc", os caracteres de 0 a 9 correspondem ao valor "asc" de 48 até 57.
Com isso foi usado um "if" para pegar somente os caracteres numericos.

Compila o código e veja se é isso que você quer fazer:
Código:
#include<stdio.h> int main(){ char c[10],r; int i; char continuar; while(1){ printf("Digite o Ano de Nascimento: "); gets(c); for(i=0;i<10;i++) { if(c[i]>47 && c[i] <58) r+=(c[i]-48); } r=(r%5); switch (r) { case 0: printf("Timido\n"); break; case 1: printf("Sonhador\n"); break; case 2: printf("Paquerador\n"); break; case 3: printf("Atraente\n"); break; case 4: printf("Irresistivel\n"); break; } printf("\nDeseja Fazer Nova Consulta ? S/N\n"); scanf("%c",&continuar); if(continuar == 'n' || continuar == 'N') break; //sai do loop else getchar(); //para não ecoar } return 0; }
br_branco está offline   Responder com Quote
Antigo 14-04-2009, 3:51   #10 (permalink)
mcv
Veterano
 
Avatar de mcv
 
Registrado em: Jun 2006
Localização: Brasil
Mensagens: 1.212
Reputação: 20 mcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todosmcv Sua luz ofusca a todos
Padrão

Citação:
Como já falaram tem que ler uma string, porém atoi colocará em 1 variável inteira os números da string, pelo que percebi tu lê vários inteiros, ou seja teria que passar para inteiro caracter-por-caracter.
Se for o caso deve ter uma função que faça isso, mas quando eu também deparei com um problema semelhante criei uma função para essa conversão, nada muito complicado só um pouco de lógica binária e uma tabela ASCII.
espero respostas, flw!
O problema de usar diretamente o código ASCII é a perda da portabilidade. O funcionamento de atoi depende do locale, o que resolve muitos problemas.

O fato de haverem vários números na string não invalida a utilidade de atoi, um pouquinho de lógica resolve a questão.
mcv está offline   Responder com Quote
Antigo 14-04-2009, 8:55   #11 (permalink)
tdz
Super Participante
 
Avatar de tdz
 
Registrado em: Feb 2008
Mensagens: 522
Reputação: 9 tdz possui ótimo potencial
Padrão

Ola a todos

br_branco

Essa parte eu não entendi:
Citação:
r+=(c[i]-48);
Seu algoritmo esta quase correto, o problema é que cada vez que eu digito, por exemplo 1984, da um resultado diferente.

o Certo seria somar 1+9+8+4 = r <=> r%=5.

De acordo com o resto da divisão, mostrar o "perfil" da pessoa, então sempre que eu digitar 1985, deveria ser 4 = Irresistivel.

Eu tentei corrigir o código mais não consegui, mais não se preocupe em fazer o código, pois o mais importante já foi solucionado, que era a questão das strings "viraren" números inteiros. Apesar de achar complicado, talvez me falte aprender alguns conceitos que não vi.

Obrigado a todos que ajudaram !

Abraços
__________________
Athlon XP 1700 +
Mobo: PCchips 810LR
HD: Samsung 40 Gb
768mb ram ( 1x256mb, 1x512mb)
Arch Linux + xfce4

Trekking Cohab II - São Paulo - Brasil
http://trilhastdz.multiply.com/
tdz está offline   Responder com Quote
Antigo 14-04-2009, 13:11   #12 (permalink)
br_branco
Membro Senior
 
Registrado em: Jan 2008
Mensagens: 342
Reputação: 12 br_branco Tem uma excelente energiabr_branco Tem uma excelente energiabr_branco Tem uma excelente energia
Padrão

É verdade eu esqueci de resetar a variavel "r" e com isso da esse problema, para corrigir é só colocar um r='\0'; antes do for:

Código:
while(1){ r='\0'; printf("Digite o Ano de Nascimento: "); gets(c); for(i=0;i<10;i++) { if(c[i]>47 && c[i] <58) r+=(c[i]-48); }
br_branco está offline   Responder com Quote
Antigo 14-04-2009, 13:33   #13 (permalink)
help_service
Membro Senior
 
Avatar de help_service
 
Registrado em: Nov 2008
Localização: RS-Brasil
Mensagens: 191
Reputação: 8 help_service está indo no caminho certo
Padrão

bom, a solução que eu tinha proposto seria essa:
Código PHP:
int ch2i(const char ch){
    if(
ch>='0' && ch<='9')  /*se for um número*/
        
return (ch 0x0F);  /*zera os 4 bits mais significativos para gerar um número sem codificação ASCII*/
    
return -1;

só para esclarecer.
vlw!

Última edição por help_service : 14-04-2009 às 13:34. Motivo: concertar codigo
help_service está offline   Responder com Quote
Antigo 14-04-2009, 14:27   #14 (permalink)
br_branco
Membro Senior
 
Registrado em: Jan 2008
Mensagens: 342
Reputação: 12 br_branco Tem uma excelente energiabr_branco Tem uma excelente energiabr_branco Tem uma excelente energia
Padrão

Gostei dessa sua solução, ficou bem melhor para entender.
for(i=0;i<10;i++)
{
if(c[i]>='0' && c[i]<='9')
r+=(c[i] & 0x0f);
}
br_branco está offline   Responder com Quote
Antigo 16-04-2009, 18:59   #15 (permalink)
intruso
Tô em todas
 
Avatar de intruso
 
Registrado em: Apr 2002
Localização: Paulista/PE
Mensagens: 1.642
Reputação: 525 intruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputação
Padrão

Citação:
Postado Originalmente por br_branco Ver Mensagens
Gostei dessa sua solução, ficou bem melhor para entender.
for(i=0;i<10;i++)
{
if(c[i]>='0' && c[i]<='9')
r+=(c[i] & 0x0f);
}
Não esqueçam da "regra sagrada da boa leitura" nos códigos, "não usaras números mágicos nem constantes escritas por todo o código."

Com isso eu quero apenas dizer que se for usar uma constante em algum lugar do código, use #define para isso ou const.

Não escreva números pelo seu código, isso o torna menos legível e mais difícil de manter, já que se esses números mudarem você tem que ir alterando todo lugar que contem esse cara.

Para decidir se vai usar #define ou const, você deve pensar no seguinte, constantes criadas com o const serão guardadas na memória no modo "read-only", não podendo ser alteradas. Já as constantes criadas pelo #define serão substituídas no código "na hora da compilação", então depende da utilidade da coisa, por exemplo, você não vai poder passar um ponteiro para algo que está escrito no código, mas, pode apontar para algo que está na memória, entende?? depende do caso.

abraço.
__________________
Dê uma lida:
Eu não dou o peixe, ensino a pescar.

Meu Blog.
intruso 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 20:40.