[Multi] C++, Introducción y las variables

Buenas, comenzamos el tutorial de C, me voy a dejar mucho en el tintero pero intentare que sea lo mas completo posible para empezar a trabajar desde cero. Si ya sabes de programacion aqui no encontraras nada que puedas necesitar, y si meto mucho la pata antes de degollarme decidmelo, lo corrigo y aqui no ha pasado nada. [+risas]

Lo primero: C es un lenguaje de programacion complejo, y lo es tanto por sus posibilidades como por sus limitaciones a la hora de poner identificadores(nombres) en sus origenes.

En vez de poner StringCompare en C se llama strcmp puesto que en C ANSI solo son significativos los 6 primeros caracteres, osea que StringCompare y StringContainer seria lo mismo pues son identicas para el.

Esto es una traba al principio pero acostumbrarse no cuesta tanto y menos aun despues de los lenguajes SMS.

Reconoce Mayusculas y minusculas asi que ab,Ab,aB,AB son cuatro cosas diferentes. De esto se derivan muchos fallos al principio hasta acostumbrarse. Existe una cosa llamada notacion. Esta nos da unas reglas para nombrar las variables y funciones de nuestro programa. Cada palo que aguante su vela y que cada cual elija la suya. Si quiereis saber mas de estas cosas buscad leyes de construccion de programas. (Es una mierda al principio pero cuando sepais programar va bien).

Tambien existen palabras que no podemos usar en nuestros nombres pues son palabras reservadas de C y son:



    auto  double  int  struct  break  else  long  switch  case  enum
    register  typedef  char  extern  return  union  const  float  short     
    unsigned  continue  for  signed  void  default  goto  sizeof  volatile      do  if  static  while





Para comentar una linea (poner un texto que no es compilado explicando el codigo fuente) tenemos dos formas



// Una linea
/*
Pudiendo ocupar varias lineas
Se cierra con la secuencia */




Las constantes simbolicas son una serie de datos que se definen y en el preprocesador se sustituyen por su valor.



#define PI 3.14159




En las partes que hayamos escrito PI en la precompilacion se sustituiran por el valor numerico.
Todas las lineas acaban con punto y coma ; excepto:
Instrucciones al preprocesador (el #define #include...)
Funciones ( que no llevan ; ni en su apertura ni en su cierre, pero si dentro de ellas)
La enumeraciones aunque las coloquemos en varias lineas realmente solo ocupan una linea y se cierran con ;
Si no ponemos el ; el compilador cree que la instruccion continua en la linea siguiente creando una serie de errores rarisimos (no dice que falte ; sino cualquier otra cosa)

Bueno espero que esta introduccion os sirva para algo , aunque sin mas conocimientos no sirve para nada. Comenzamos.


Las variables.[size=80]Tipos de datos[/size]

En todo programa nosotros necesitamos almacenar datos. Unos seran constantes pero otros de ellos seran variables.

Una variable en programacion es un espacio de memoria definido. Hay diferentes tipos y cada una de ellas ocupa una cantidad fija de bits, a su vez tambien, cada una de ellas es tratada de diferente manera. Las podemos encajar en dos grupos, primitivas y derivadas (de momento esto nada que ver con las matematicas).

Primitivos: son los tipos de datos que se nos proporciona para empezar a trabajar.
Derivados: son aquellos que se forman de uno o mas tipos primitivos y/o modificando su comportamiento.

Primitivos

Para poder desarrollar debemos conocer los diferentes tipos para usar el adecuado en cada momento.

Enteros (con paso de 1, asi que no pueden almacenar decimales) 8 bits = 1 byte

numericos
long(largo,entero): longitud 32 bits, almacena datos en un rango de 0<>2^32 sin signo y 2^16-1 <> -(2^16) con signo.
int (integer,entero): longitud 32 bits, almacena datos en un rango de 0<>2^32 sin signo y 2^16-1 <> -(2^16) con signo.
short(¿corto?,entero): longitud 16 bits, almacena datos en un rango de 0<> 2^16 sin signo y 2^8-1 <> -(2^8) con signo.
enum(enumeracion,entero con claves): la enumeracion es un tipo de dato que contiene valores numericos y claves alfanumericas.
El tipo de datos long es segun que sistemas puede ocupar 64 bits (ps2) ocupando asi en memoria el doble. Gracias a hermes por las correciones.

alfanumericos
char(caracter,entero): longitud 8*numchar + 8 de final de cadena bits. Almacena el valor de un caracter.Vease literales
numchar=numero de caracteres asignados a la varible

Ejemplos



signed long a = 10; //Si el valor que le demos va a ser pequeño, es un gasto innecesario de memoria usar este tipo (mas en concreto el doble)
                unsigned long a=123456; //Este si que seria un valor para usar en este tipo
                signed short b = -257; //MECC!!!! ERROR acabamos de producir un desbordamiento
                unsigned short b = 255 //Perfecto pero si sube uno mas provocara un desbordamiento
                signed int c= -32764 //Al limite otra vez, pero fijese que si le cambiamos el signo si que producimos un desbordamiento
                unsigned int c = 13 //Lo mismo que el ejemplo
                enum Color { rojo,azul,amarillo=0}; //Mas abajo explico la enumeracion
                char vocal='a'; //Las comillas simples son para caracteres sueltos, esto es un literal
                char vocal=97; //97 es el valor ASCII de la a
                char nombre="Carlos"; //Las palabras compuestas de mas de una letra se encierran entre comillas dobles, y esto tambien es un literal




Reales (con capacidad de almacenar decimales, numeros en formato cientifico 123E-05)

float(coma flotante,real): longitud 32 bits destinados a 1 bit signo 23 bits mantisa (123) 8 bits exponente (E-05) Los valores se almacenan con una precision maxima de 7 digitos rango maximo 10^56.
double(doble,real): longitud 64 bits destinados a 1 bit signo 52 bits mantisa y 11 bits exponente. Precision maxima 16 digitos, rango maximo 10^176

Ejemplos:



float a = 1.234F; //La F indica que el numero asignado es Float (obligatorio)
                float a = 2.5e+5F; //asignado en notacion cientifica 2.5*10^5
                double b = 1.234; //Sin necesidad de una letra para indicar tipo
                double b = 2.5e-5 // 2.5 * (1/10)^5 = 0,000025





Enum
Voy a hacer un desarrollo sobre las enumeraciones pues es conveniente.
Son tipos de datos enteros creados para acercar la tarea de programar al lenguaje humano. Nosotros definimos unos nombres y de forma explicita o implicita se le asigna un valor numerico a cada uno de ellos. Para entenderlo unos ejemplos


#include
#include

enum Color{
Rojo, /* valor 0*/
Azul,
Verde, /* valor 2*/
Amarillo=0, /*Valor 0 y reseteo el contador*/
Marron, /*valor 1*/
};

void main(){

enum Color color; //Se declara la variable que contendra el valor
printf ("Color preferido: "); //Se muestra en pantalla el mensaje entre ""
scanf ("%d", &color); //Se introduce en color lo que hayamos escrito con el teclado...¿¿¿&??? jejej mas adelante no quieras correr
printf ("%d\n", color); /*Se muestra lo que hemos escrito...pero que pasa...me saca un numero....esto es normal pues el nombre es la clave y el valor el contenido REAL*/
getch(); //Espera a que se pulse una tecla (por si acaso para que no se cierrre el programa sin ver la salida)
}

Char

En este tipo tambien hay que detenerse.
Aunque ocupa poca memoria, esto es solo para un caracter. Si introducimos mas de un caracter, se crea una matriz de ellos Oooh dejemoslo en que se declaran tantos char como caracteres hay en el texto introducido(las matrices vendran proximamente). Las cadenas tienen un caracter especial para indicar el final de la cadena: \n. Pero tambien existen modificadores para la cadena:
\n tambien es salto de linea
\t tabulardor horizontal
\v tabulador vertical (solo impresora)
\b Retroceso (backspace)
\r Vuelve al principio de linea
\f Alimentacion de pagina (solo impresora)
\a Alerta,pitido
\' comilla simple
\" comilla doble
\\ barra inversa
\ddd Caracter ASCII. Representacion octal (d es un digito del 0 al 7)
\xdd Caracter ASCII Representacion hexadecimal (d es un digito de 0 a 9 y de A a F. Gracias a JVF por la correcion.

Ejemplo



   char a = "Te digo "trigo" por no decirte "Rodrigo"" // La salida sera: Te digo "trigo" por no decirte "Rodrigo"





Derivados

Son tipos creados a partir de primitivos, en el capitulo de arrays los veremos y en las sobrecargas les daremos su verdadera importancia.

Sinonimos

Se usa para facilitarnos la vida a la hora de entender un programa asi como programarlo. Se usa la palbra reservada tipedef

Ejemplo



  typedef int entero;
    typedef unsigned long ulong;





Constantes

En un programa puede que tengamos algun valor que se repita siempre, entonces podemos declararlo como contante. Sera invariable a lo largo de todo el programa.El mejor ejemplo es pi:




    const float pi=31415927E-6F;





Literales

Son tipos de datos de un tipo primitivo 1, 3 ,5 o "hola" son literales.Pueden ser un numero, un caracter o una cadena de caracteres.
Si el literal es decimal y no tiene sufijo, su tipo es el primero de int , long o unsigned long en el que quepa.

Podemos modificalor poniendo los sufijos
L long
UL unsigned long
U unsigned int
F float

Las cadenas de caracteres van encerradas entre comillas para que a la hora de compilarlo se sepa que son caracteres y no variables ni nombre de funciones etc....
Un caracter suelto se puede encerrar entre comillas simples (las de al lado del cero del teclado)

Conversion de tipos
Cuando vamos a asignar valores a una variable habra veces que no tengamos que indicar el tipo de valor, esto se llama conversion implicita (osea que no tenemos que hacer nada) pero habra veces que no se nos permita hacer esto entonces deberemos usar el CAST

Cast
Es una forma de hacer conversiones de un tipo a otro, es muy facil de usar y no deberia dar lugar a errores. Se usa asi
tipo nombre=(tipo)valor;

Ejemplos:
int a = 100;
int b = a;
float c =(float)a;
double d= (double)(a*b);
double d =(double)a * (double)b;


Bueno llegamos al final de este capitulo dedicado a las variables, espero no haber metido mucho la pata (hace mucho que no uso c) y se que este capitulo no tiene utilidad a priori pero es que los comienzos son un poco lentos.
aunq personalmente estoy un paso por encima... ;) este tuto es la polla :D muchas gracias por el

el siguiente uno de la std? uso de maps y tal eso taria wapo y poniendo ls costes ...
PiratePila está baneado por "crearse clones para trollear"
No me lo he leído entero, pero parece muy completo.

Gracias.
5 estrellas!

Me vendra bien cuando tenga alguna duda en fundamentos de programacion... [oki]
El hexadecimal es de 0 a F y no a G.


Saludos.
Tremendo tutorial para la gente que se quiere iniciar, si señor!
long(largo,entero): longitud 32 bits, almacena datos en un rango de 0<>2^32 sin signo y 2^16-1 <> -(2^16) con signo.
int (integer,entero): longitud 16 bits, almacena datos en un rango de 0<>2^16 sin signo y 2^8-1 <> -(2^8) con signo.
short(¿corto?,entero): longitud 8 bits, almacena datos en un rango de 0<> 2^8 sin signo y 2^4-1 <> -(2^4) con signo.


Humm, yo no haria estas aseveraciones debido a:

short ->16 bits, en la actualidad (PC y consolas)

int-> 32 bits, en la actualidad (PC y consolas)

long-> normalmente, 32 bits, pero por ejemplo, en PS2 es de 64 bits

Espero que no te moleste esta pequeña ¿correccion?, pues si bien los tipos dependen de la plataforma, es mejor que la gente se habitue a los valores mas comunes que se va a encontrar desarrollando para PC o consola.
Si eso tenia yo en la documentacion que he seguido pero he pensado que era un error pues entonces el long y el int almacenan lo mismo, en breves lo corrigo. Y molestarme?? too lo contrario gracias, gracias y gracias. [beer] Como he dicho hace mucho que no tocaba c y esto me ta sirviendo para volverme a poner al dia, ahora bien atreverme con la negrita....tengo miedo de cascarla.
Asias hermes y a Jvf por lo del hexadecimal que yo ni cuenta me he dado (y eso que me gustan las mates)...
PauSaDRaMaTiCa escribió:Si eso tenia yo en la documentacion que he seguido pero he pensado que era un error pues entonces el long y el int almacenan lo mismo, en breves lo corrigo. Y molestarme?? too lo contrario gracias, gracias y gracias. [beer] Como he dicho hace mucho que no tocaba c y esto me ta sirviendo para volverme a poner al dia, ahora bien atreverme con la negrita....tengo miedo de cascarla.
Asias hermes y a Jvf por lo del hexadecimal que yo ni cuenta me he dado (y eso que me gustan las mates)...



OK. Siendo así, podrias añadir un tipo compuesto: long long.

long long equivale a 64 bits (aunque hay que recordar que estas longitudes son dependientes de la plataforma, aunque este valor es el mas estandarizado)

Podemos definir una constante como 1000LL

Atrevete con la negrita, que no te la vas a cargar y es divertido :).

Mola que alguien se ponga a hacer un cursillo de C para los principiantes, pero ya que se supone va orientado hacia consolas, no dejes de explicar la importancia de alinear los datos, sobre todo en los structs ya que los procesadores RISC con los que van equipados nuestras maquinas, no admiten lecturas/escrituras de memoria desalineadas con respecto el tipo que queremos leer (por ejemplo, un int debe estar alineado a 4, siendo los offset de memoria validos xxxx0, xxxx4 , xxxx8, xxxxC)

Esto en principio, sería programacion avanzada, pero cuando trabajamos en consola hay que tenerlo MUY presente y por tanto, mas vale tenerlo en cuenta desde el principio .

En los compiladores GNU, se puede usar __attribute__ ((__packed__)) a la hora de definir un struct para que el compilador trate el acceso a esas variables utilizando lecturas o escrituras byte a byte, aunque tambien se puede especificar de forma generica, usando #pragma

#pragma 1, estableceria los accesos a los datos usando rutinas de lectura/escritura byte a byte , mientras que #pragma 0 se usaria para restablecer el modo de acceso normal.

En fin, espero que estas notas aclaren un poco el siempre espinoso asunto de los accesos alineados, pues es muy común observar fallos de este tipo, sobre todo en los structs y usando punteros, aunque son muy sencillos de eviar cuando se programa teniendo esto siempre presente ;)
Hermes escribió:

OK. Siendo así, podrias añadir un tipo compuesto: long long.

long long equivale a 64 bits (aunque hay que recordar que estas longitudes son dependientes de la plataforma, aunque este valor es el mas estandarizado)

Podemos definir una constante como 1000LL

Atrevete con la negrita, que no te la vas a cargar y es divertido :).

Mola que alguien se ponga a hacer un cursillo de C para los principiantes, pero ya que se supone va orientado hacia consolas, no dejes de explicar la importancia de alinear los datos, sobre todo en los structs ya que los procesadores RISC con los que van equipados nuestras maquinas, no admiten lecturas/escrituras de memoria desalineadas con respecto el tipo que queremos leer (por ejemplo, un int debe estar alineado a 4, siendo los offset de memoria validos xxxx0, xxxx4 , xxxx8, xxxxC)

Esto en principio, sería programacion avanzada, pero cuando trabajamos en consola hay que tenerlo MUY presente y por tanto, mas vale tenerlo en cuenta desde el principio .

En los compiladores GNU, se puede usar __attribute__ ((__packed__)) a la hora de definir un struct para que el compilador trate el acceso a esas variables utilizando lecturas o escrituras byte a byte, aunque tambien se puede especificar de forma generica, usando #pragma

#pragma 1, estableceria los accesos a los datos usando rutinas de lectura/escritura byte a byte , mientras que #pragma 0 se usaria para restablecer el modo de acceso normal.

En fin, espero que estas notas aclaren un poco el siempre espinoso asunto de los accesos alineados, pues es muy común observar fallos de este tipo, sobre todo en los structs y usando punteros, aunque son muy sencillos de eviar cuando se programa teniendo esto siempre presente ;)


hermes, te respeto como programador, pero difiero en tu forma de pensar creo que tutoriales explicando cosas avanzadas deberian estar mas alante ya que cuando estas aciendo un juego o algo para una consola con recuros limitados lo que debes de hacer es hacer primero el programa que funcione bien ( sobre todo importante el uso de estruccturas de datos correctas, ej: no es lo mismo una lista que un vector y mucha gente no lo sabe bien ... ) bueno y luego te dedicas ha hacer profiles , de dibujado de entrada de dibujado de una cosa especifica de procesamiento de ia de lo que sea y esa parte si que mejor la optimizas. Yo siempre he pensado que el estar pensando siempre en el código optimizado a la máquina es una fuente de errores...

joer que toxo ...
El tutorial fantastico, tanto para los q empiezan para tener una base de consulta como para repasar conceptos.

Hermes eso de la alineacion de datos no se como va, ni se como tratarlo, ¿hay algun tutorial por la red q explique esto de la alineacion? yo simplemente escribo codigo si funciona pues bien si no pues 2 piedras.....
Ya me ha pasado varias veces estar escribiendo un programa y derepente dejar de funcionar, cambiar algun int de sitio y volver a funcionar (en PSP) no se si pueda deberse a la alineacion esa q comentas..
Sobre la alineacion.... a la hora de definir una estrucutra se puede usar un modificador : detras de los tipos declarados, esto indica la cantidad de bits que tiene el campo. Gracias a esto podemos conseguir semaforos que solo ocupan 1 bit en memoria, al alinearlos conseguimos que se rellenen con el minino espacio entre ellos. Hay diferentes tipos de alineacion,palabra, doble palabra....pero coincido con saulotmalo en que esto deberia ir mas al final que al principio, pues son conceptos complejos y que a un programador novel le puede crear mas confusion que ayuda. La idea es crear un documento estandar para todos los sistemas, y despues si acaso crear apendices sobre ello. En la programacion es bueno recorrer el camino andando, que no corriendo(me lo dice la experiencia). Tambien si me llegan los conocimientos, creare un apendice de matematicas y curiosidades, para su utilizacion en algoritmos.
long a = 123445;
int b = a / 8; se puede sustituir por int b = a >> 3;
Hayar coordenadas de los diferentes puntos de un circulo (para hacer relojes analogicos, asi como movimientos en entornos 3d)
radio*sin((angulo*pi/45)>>2)+coordXinicial
radio*cos((angulo*pi/45)>>2)+coordYinicial
.... Un desplazamiento de bits es equivalente a /2, mas en concreto, desplazar los numeros a la derecha en cualquier base numerica es el equivalente a /base^n siendo base el sistema de numeracion (decimal 10, binario 2, octal 7) y n la cantidad de posiciones que se ha desplazado.
Perdonad que os contradiga, pero lo de la alineaión de datos, es algo BASICO al tratar con structs y punteros, tan basico es que muchos programas FALLAN debido a que los programadores no tienen asumido este problema desde el principio.

Esto es como si voy a aprender a conducir el coche en un pais nordico, en pleno invierno y con las carreteras heladas... ¿sería conduccion avanzada que el profesor me enseñara como corregir un derrapaje sobre hielo o en estas condiciones tan malas sería algo basico?

Creando structs, la cosa es relativamente sencilla, es solo cuestion de hábitos (y estos hábitos o se adquieren desde el principio o luego CUESTA mas tiempo adquirirlos y un monton de problemas)

Ejemplo de declaracion en un PC x86:

struct
{
char a;
int b;
char c;
int d;
} manolo;


Este struct es un incendio en un polvorín, así de claro.

Una forma correcta de declararlo, sin recurrir al atributo packed (que dicho atributo a veces es escupido por los compiladores...) sería:

struct
{
int b; // esto garantiza alineacion a 4 bytes del struct
char a;
char c;
char pad[2]; // datos basura para restaurar la alineacion a 4
int d;
} manolo;


Como vemos, he necesitado alterar el orden de los datos para garantizar la alineación de los ints e incluso añadir un nuevo campo con datos inutiles para volver a restaurar la alineacion NECESARIA para int d, despues de la declaracion de los char.

Ojo! que esta alineacion no se hace para ganar velocidad.... se hace para evitar que el procesador llegue a leer un int desalineado provocando una excepción que acaba en un cuelgue o un fallo de nuestro programa que si no se tiene claro de donde viene el fallo, es IMPOSIBLE de corregir.

Así que no estamos hablando de optimización, si no de necesidad de cambiar la forma de trabajar, ya que incluso si el compilador se tomase la molestia de ajustar la alineación de los datos por su cuenta, no es lo mismo que un char ocupe 1 byte, que 4 bytes (dentro del struct, porque fuera, en las variables globales, eso da igual)

Y con los punteros, es el mismo problema.

PD: Lo malo de C es que es un lenguaje muy dependiente de la plataforma y la portabilidad de programas puede ser mas dificil de lo que parece ya que la programación desde una plataforma x86 a ARM o MIPS es algo diferente

Saludos.
Esto es como si voy a aprender a conducir el coche en un pais nordico, en pleno invierno y con las carreteras heladas... ¿sería conduccion avanzada que el profesor me enseñara como corregir un derrapaje sobre hielo o en estas condiciones tan malas sería algo basico?


Primero tienes que aprender a:
Encender el coche
Regular los espejos
Manejo del embrague....

Tienes toda la razon, pero va a haber dos puntos cruciales:
Yo, solo he programado para pcs.
Aun no hemos llegado a los structs : P (me gustan los smilies antiguos).

Aun recuerdo aquello de ver divx en la ps2?? imposible.... [plas]asi que tu opinion (como la de los demas, no te creas) no va a caer en desmerito, sino que me parece que es un tema txungo para un novel, pues ellos no conocen nada de arquitectura y ahi radica el problema.
Un ejemplo (como tambien te guste la fisica pues mal ejemplo), la teoria del todo habla de la constitucion basica de la materia. Pero para que esta sea posible hace falta imaginarnos un espacio con 26 dimensiones(la unificacion habla de 26 las individuales de 11....) . Si yo te digo que tienes que empezar a pensar no en 4 dimensiones sino en 26 te da un patatus. Pues eso mismo le va a pasar a un novel (es que novato la gente la usa a modo despreciativo muchas veces y no me gusta usarla) como empecemos con cosas mas complejas que una simple estructura de datos.
Como decia calderon: caminante no hay camino, se hace camino al andar.

P.D. esto esta siendo mas divertido de lo que creia. Gracias
PauSaDRaMaTiCa escribió:
Primero tienes que aprender a:
Encender el coche
Regular los espejos
Manejo del embrague....

Tienes toda la razon, pero va a haber dos puntos cruciales:
Yo, solo he programado para pcs.
Aun no hemos llegado a los structs : P (me gustan los smilies antiguos).

Aun recuerdo aquello de ver divx en la ps2?? imposible.... [plas]asi que tu opinion (como la de los demas, no te creas) no va a caer en desmerito, sino que me parece que es un tema txungo para un novel, pues ellos no conocen nada de arquitectura y ahi radica el problema.
Un ejemplo (como tambien te guste la fisica pues mal ejemplo), la teoria del todo habla de la constitucion basica de la materia. Pero para que esta sea posible hace falta imaginarnos un espacio con 26 dimensiones(la unificacion habla de 26 las individuales de 11....) . Si yo te digo que tienes que empezar a pensar no en 4 dimensiones sino en 26 te da un patatus. Pues eso mismo le va a pasar a un novel (es que novato la gente la usa a modo despreciativo muchas veces y no me gusta usarla) como empecemos con cosas mas complejas que una simple estructura de datos.
Como decia calderon: caminante no hay camino, se hace camino al andar.

P.D. esto esta siendo mas divertido de lo que creia. Gracias


Tu no te preocupes, tu haz tu curso como lo tienes pensado y dejame a mi meter mis complementos, pues, hazte a la idea de que te está leyendo gente que no sabe programar y gente que si sabe programar y que seguro que encuentra esto bastante interesante pues, el fallo en los structs y los punteros es MUY habitual, sobre todo en aquellos que hemos empezado con maquinas que no tenía este problema (PC)

Ademas, yo creo que si en este cursillo se encuentra informacion 'que no viene en los libros' se convierte en doblemene util y si encima, nos lo pasamos bien dando nuestros puntos de vista.... ¿que mas podemos pedir? XD
Hermes escribió:
Tu no te preocupes, tu haz tu curso como lo tienes pensado y dejame a mi meter mis complementos, pues, hazte a la idea de que te está leyendo gente que no sabe programar y gente que si sabe programar y que seguro que encuentra esto bastante interesante pues, el fallo en los structs y los punteros es MUY habitual, sobre todo en aquellos que hemos empezado con maquinas que no tenía este problema (PC)

Ademas, yo creo que si en este cursillo se encuentra informacion 'que no viene en los libros' se convierte en doblemene util y si encima, nos lo pasamos bien dando nuestros puntos de vista.... ¿que mas podemos pedir? XD


yo considero que sé programar ( modestia a parte ) weno y la verdad aun así lo veo muy interesante estos tutoriales que esta haciendo :) además le da vidilla al foro
15 respuestas