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

killerhcf

duvidas num programa em c

6 mensagens neste tópico

bem sao algumas duvidas para esclarecer o programa é o seguinte:

#include<stdio.h>


main()
{
int c, i, nwhite, nothers;
int ndigit[10];

nwhite=nothers=0;
for(i = 0; i<10 ; ++i)
ndigit[i] = 0;

//ndigit[0]=ndigit[1]=ndigit[2]=ndigit[3]=ndigit[4]=ndigit[5]=ndigit[6]=ndigit[7]=ndigit[8]=ndigit[9]=0;
while( (c=getchar()) != EOF && c != '\n')
if(c >= '0' && c <= '9' ) 
++ndigit[c-'0'];
else if (c == '\n' || c == '\t' || c == ' ' ) 
++nwhite;
else
++nothers;

printf("digits =");
for (i = 0; i<10 ; ++i) 
printf("%d",ndigit[i]);
printf(",o numero de espacos bracos :%d , outros simbolos :%d\n", nwhite, nothers); 

getchar();
} 

o programa original nao tinha o getchar(); final nem o c != '\n' o problema era que para testar se tava a funcionar bem inseria la uns nºs com espcos e letras mas carregava em enter e nao dava nada =( pois acho que tem ver com o EOF que para eu ver o resoltado so quando eu metese entao o EOF, pois mas nao ja tive a ver na net ja isso ja algum tempo atras mas nao resultava o que eles diziam que era o -1 ou ctrl z acho eu que eram estes dois, pois gostava de saber entao qual é o valor ou simbolo ou o quer que seja que define o EOF bem mas alterei um pouco o progama so para se funcionava o resto .

a 2º duvida é que

if(c >= '0' && c <= '9' )

++ndigit[c-'0'];

isto entao faz incrementar o 1,2,3...9 mas nao tou a ver o raciozinio disto como é que sabe qual é o valor que deve incrementar e a posicao que deve meter o valor incrementado la em cima ta defenido o array com as 10 posicoes para os 10 digitos iniciados a 0.

pronto é estas as duvidas podem tar é para o confuso =)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EOF tem o valor de -1 e é o valor que a função getchar retorna quando chega ao fim do input.

A questão do:

if(c >= '0' && c <= '9' )

++ndigit[c-'0'];

funciona da seguinte forma: um caracter é identificado por um código que está definido na tabela ASCII, ou seja, o '0' tem um valor inteiro. Ao fazer if (c>='0' && c<='9') estás a garantir que o caracter lido é um algarismo (já que na tabela ASCII os algarismos estão todos em sequência). Queres depois incrementar a posição do vector ndigit que corresponde ao algarismo que acabaste de ler. Ora porque é que estás a incrementar o índice c - '0'? Pelo seguinte: como os algarismos estão todos seguidos na tabela ASCII se fizeres '5'-'3' vais obter a diferença entre o código do caracter '5' e do caracter '3' que será 2. Ao fazer c - '0' estás a subtrair o código do caracter '0' ao código do caracter c que acabaste de ler. Vais portanto incrementar o vector na posição que corresponde exactamente ao algarismo que acabaste de ler.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim a parte da segunda duvida percebi, mas aqulio do -1 do EOF ja nao percebi bem , eu meto o que quiser ver e depois meto -1 la jalena  para acabar o ciclo do incrementar e dar o resultado?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não. Tens que inserir o caracter com significado EOF, que obténs na consola carregando em CTRL+Z.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

=) é o ctrl+c afinal mesmo assim aquilo fecha antes de poder ver o resultado bem acho que o programa melhor mesmo é assim so nao percebo entao o EOF nem é necessario... pois com o EOF so nao parece resultar la muito bem pois fecha logo mas ainda assim vejo que so aparece=0 ha frenta dos dados que inseri

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

main()
{
int c, i, nwhite, nothers;
int ndigit[10];

nwhite=nothers=0;
for(i = 0; i<10 ; ++i)
      ndigit[i] = 0;
     
//ndigit[0]=ndigit[1]=ndigit[2]=ndigit[3]=ndigit[4]=ndigit[5]=ndigit[6]=ndigit[7]=ndigit[8]=ndigit[9]=0;
while( (c=getchar()) != EOF && c != '\n')
      if(c >= '0' && c <= '9' ) 
         ++ndigit[c-'0'];
      else if (c == '\n' || c == '\t' || c == ' ' ) 
         ++nwhite;
      else
         ++nothers;

printf("digits =");
for (i = 0; i<10 ; ++i)   
    printf("%d",ndigit[i]);
printf(",o numero de espacos brancos :%d , outros simbolos :%d\n", nwhite, nothers);         
          
if (getchar() != 'k')
  main();
else exit(1);  
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é o ctrl+c

Não sei se te enganaste ou se era mesmo isso que querias dizer, mas o EOF não é CTRL-C, é CTRL-Z. CTRL-C é um break para terminar o programa.

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