Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





C

Iniciado por Diegunix, 06 de Junio de 2008, 08:35:49 PM

« anterior - próximo »

Diegunix

Que significa esto??
si c es igual o mayor que 0 y c es menor o igual que 9 contar ??  

 if (c>='0' && c <='9')
     ++ndigit[c-'0']


#include <stdio.h>

main ()

{
 int ndigit[10];
 int i;

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

while ((c=getchar())!=EOF)
 {
    if (c>='0' && c <='9') {
     ++ndigit[c-'0']
   }
printf ('Digitos='');
for (i=0;i<10;++i)
printf (''%d'',ndigit[i]);

}
}
ascal-C

Worvast

La verdad....si no contamos que el mini programa que has puesto tiene fallos por todos lados, que, seguramente ni has probado para que sirve, contestaré que significa "por encima" lo siguiente, no sin antes decirte....currate un poco mas las cosas, enserio:

if (c>='0' && c <='9') //Basico, vamos, si c está entre 0 y 9, ambos inclusive
++ndigit[c-'0'] ; //A ndigit[c] (Por que el -0 es una inutilidad total) se le suma uno al valor que tenía



Pero vamos, que si no entiendes estas cosas tan básicas, deberías mirarte antes mejor los principios de C


Bye-nee

pacomix

Así a simple vista parece que cuenta la cantidad de veces que aparece un dígito del 0 a 9...
¿se nota que me aburro mucho hoy? xD
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

Diegunix

arrascate el ganso si te aburrìs papaaà,  yo estoy acà para preguntar algo que no entendì!!
ascal-C

gdl

Cita de: "Worvast"if (c>='0' && c <='9') //Basico, vamos, si c está entre 0 y 9, ambos inclusive
++ndigit[c-'0'] ; //A ndigit[c] (Por que el -0 es una inutilidad total) se le suma uno al valor que tenía

Esto no es correcto. No restas 0, restas '0', que son cosas distintas. Por un lado 0 sí que es el cero de toda la vida, pero por otro '0' es el código del carácter cero que, en ASCII, es 48. Así que sí es importante y necesario para que el programa funcione bien.

La idea es que cuando escribes algo getchar() te devuelve el código de los caracteres que escribes. Por ejemplo, si escribes "A" te devuelve 65. Entonces, la primera comprobación es

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

que es algo así como si lo que has escrito está entre los códigos del cero y del nueve (ambos inclusive). Luego ++ndigit[c-'0'] hace dos cosas. La primera es restarle el código del cero con el  c-'0'. Como los códigos de los caracteres de los números son consecutivos, obtenemos el valor del número.

Si escribiste "0" entonces el código es 48 (c=48) y entonces c-'0'=48-48=0
Si escribiste "1" entonces el código es 49 (c=49) y entonces c-'0'=49-48=1
Si escribiste "2" entonces el código es 50 (c=50) y entonces c-'0'=50-48=2
Si escribiste "3" entonces el código es 51 (c=51) y entonces c-'0'=51-48=3
etc.

Una vez que el programa ha calculado c-'0', accede a esa posición del array ndigit mediante ndigit[c-'0']. El ++ delante indica que lo incremente en uno, por lo que ++ndigit[c-'0'] significa "incrementa en uno el valor de ndigit en la posición c-'0' ".

Espero que te ayude la explicación.

Prompt


Diegunix

Cita de: "gdl"
Cita de: "Worvast"if (c>='0' && c <='9') //Basico, vamos, si c está entre 0 y 9, ambos inclusive
++ndigit[c-'0'] ; //A ndigit[c] (Por que el -0 es una inutilidad total) se le suma uno al valor que tenía

Esto no es correcto. No restas 0, restas '0', que son cosas distintas. Por un lado 0 sí que es el cero de toda la vida, pero por otro '0' es el código del carácter cero que, en ASCII, es 48. Así que sí es importante y necesario para que el programa funcione bien.

La idea es que cuando escribes algo getchar() te devuelve el código de los caracteres que escribes. Por ejemplo, si escribes "A" te devuelve 65. Entonces, la primera comprobación es

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

que es algo así como si lo que has escrito está entre los códigos del cero y del nueve (ambos inclusive). Luego ++ndigit[c-'0'] hace dos cosas. La primera es restarle el código del cero con el  c-'0'. Como los códigos de los caracteres de los números son consecutivos, obtenemos el valor del número.

Si escribiste "0" entonces el código es 48 (c=48) y entonces c-'0'=48-48=0
Si escribiste "1" entonces el código es 49 (c=49) y entonces c-'0'=49-48=1
Si escribiste "2" entonces el código es 50 (c=50) y entonces c-'0'=50-48=2
Si escribiste "3" entonces el código es 51 (c=51) y entonces c-'0'=51-48=3
etc.

Una vez que el programa ha calculado c-'0', accede a esa posición del array ndigit mediante ndigit[c-'0']. El ++ delante indica que lo incremente en uno, por lo que ++ndigit[c-'0'] significa "incrementa en uno el valor de ndigit en la posición c-'0' ".

Espero que te ayude la explicación.
otro richard stallman 2 son unos genios estos tipos
ascal-C

Diegunix

Entonces sigo con funciones
ascal-C

Worvast

Cita de: "gdl"
Cita de: "Worvast"if (c>='0' && c <='9') //Basico, vamos, si c está entre 0 y 9, ambos inclusive
++ndigit[c-'0'] ; //A ndigit[c] (Por que el -0 es una inutilidad total) se le suma uno al valor que tenía

Esto no es correcto. No restas 0, restas '0', que son cosas distintas. Por un lado 0 sí que es el cero de toda la vida, pero por otro '0' es el código del carácter cero que, en ASCII, es 48. Así que sí es importante y necesario para que el programa funcione bien.

La idea es que cuando escribes algo getchar() te devuelve el código de los caracteres que escribes. Por ejemplo, si escribes "A" te devuelve 65. Entonces, la primera comprobación es

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

que es algo así como si lo que has escrito está entre los códigos del cero y del nueve (ambos inclusive). Luego ++ndigit[c-'0'] hace dos cosas. La primera es restarle el código del cero con el  c-'0'. Como los códigos de los caracteres de los números son consecutivos, obtenemos el valor del número.

Si escribiste "0" entonces el código es 48 (c=48) y entonces c-'0'=48-48=0
Si escribiste "1" entonces el código es 49 (c=49) y entonces c-'0'=49-48=1
Si escribiste "2" entonces el código es 50 (c=50) y entonces c-'0'=50-48=2
Si escribiste "3" entonces el código es 51 (c=51) y entonces c-'0'=51-48=3
etc.

Una vez que el programa ha calculado c-'0', accede a esa posición del array ndigit mediante ndigit[c-'0']. El ++ delante indica que lo incremente en uno, por lo que ++ndigit[c-'0'] significa "incrementa en uno el valor de ndigit en la posición c-'0' ".

Espero que te ayude la explicación.


Nunca te acostarás sin saber algo nuevo, gracias por ampliar un poquito mas mis horizontes :)


Bye-nee

gdl

De nada, Worvast. Es que el C es muy jodido. (Algún forero decía que el C/C++ es como tu mujer, que nunca la llegas a conocer del todo...)

Marci

Y si alguien quiere flipar de verdad que busque programación ofuscada en google :twisted:

Os dejo un ejemplo de un hola mundo (sacado de http://mundogeek.net/archivos/2008/02/27/hola-mundo-ofuscados/):

#include<stdio.h>
main(){
   int x=0,y[14],*z=&y;*(z++)=0×48;*(z++)=y[x++]+0×1D;
   *(z++)=y[x++]+0×07;*(z++)=y[x++]+0×00;*(z++)=y[x++]+0×03;
   *(z++)=y[x++]-0×43;*(z++)=y[x++]-0×0C;*(z++)=y[x++]+0×57;
   *(z++)=y[x++]-0×08;*(z++)=y[x++]+0×03;*(z++)=y[x++]-0×06;
   *(z++)=y[x++]-0×08;*(z++)=y[x++]-0×43;*(z++)=y[x]-0×21;
   x=*(--z);while(y[x]!=NULL)putchar(y[x++]);
}


Si es que hay gente que se aburre mucho :lol:






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.