miércoles, 5 de octubre de 2011

6. Ejercicios de lenguaje C (I)

Ejercicios de lenguaje C
Se plantean ejercicios con su solución propuesta para realizar. Es responsabilidad del lector hacer un uso didáctico de los ejercicios. Esto quiere decir que si copias la solución sin mas, no aprenderás el concepto que trata el ejercicio.
Además, las soluciones propuestas no son las únicas soluciones válidas. La solución mostrada es simplemente la que se considera mas didáctica. Por lo que el lector puede encontrar otra solución. De hecho, encontrar otra solución sería ideal para demostrar que ha comprendido el concepto.

Ejercicio 1: Muestra un texto estático.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 printf("Este texto es fijo.");

 return 1;
}
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.

    Si quieres programar en Windows.


Ejercicio 2: Muestra dos líneas de texto estático.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 printf("Primera linea.");
 printf("\n");
 printf("Segunda linea");
 printf("\n");

 return 1;
}
Nota: La computadora no sabe cuando acaba una línea y empieza otra. Debemos indicarle que empiece una nueva línea con la secuencia de escape '\n'.

Ejercicio 3: Muestra el valor de una variable.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 int numero = 5;

 printf("Valor de la variable: ");
 printf("%i", numero);
 printf("\n");

 return 1;
}
Notas:
No hace falta mostrar el texto estático. Pero, si no lo hacemos, sólo aparecerá en pantalla el número. Queda mejor si le añadimos un texto que nos indique lo que estamos mostrando.
Aunque se utilicen dos funciones printf, no se dibujan dos líneas. Para dibujarlo en dos líneas, deberíamos indicarle la secuencia de escape '\n'.

Ejercicio 4: Escribe un programa que muestre el tamaño en bytes (1 byte son 8 bits) de las variables de tipo char, int y float.
Solución:
#include <stdio.h>

int main(int argc, int *argv[]) {

 int caracter = sizeof(char), entero = sizeof(int), decimal = sizeof(float);

 printf( "Espacio en bytes: \n" );
 printf( "char -> %i bytes. \n", caracter );
 printf( "int -> %i bytes. \n", entero );
 printf( "float -> %i bytes.\n", decimal );

 return 1;

}
Notas:
sizeof es la única función que viene por defecto en el lenguaje C. No hace falta incluir ninguna librería.

Ejercicio 5: Escribe un programa que muestre la suma de dos números que estén almacenados en variables.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 int x = 9, y = 5, resultado;

 resultado = x + y;

 printf( "Suma: %i + %i = %i \n", x, y, resultado );

 return 1;
}
Ejercicio 6: Escribe un programa que muestre la diferencia, producto y división de dos números que estén almacenados en variables.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 int a = 6, b = 2;

 printf( "Operaciones: \n" );
 printf( "%i - %i = %i \n", a, b, a - b );
 printf( "%i * %i = %i \n", a, b, a * b );
 printf( "%i / %i = %i \n", a, b, a / b );

 return 1;
}
Notas:
Se puede usar como argumento de la función una operación (o incluso otra función) y, el resultado de ésta será el valor que se envíe a la función.

Ejercicio 7: Escribe un programa que compruebe y muestre si dos números almacenados en variables son iguales.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 int x = 2, y = 3;

 if( x == y ) {
  printf( "%i es igual a %i. \n", x, y );
 } else {
  printf( "%i es distinto a %i. \n", x, y );
 }

 return 1;
}
Ejercicio 8: Escribe un programa que compruebe y muestre si un número almacenado en una variable es par o impar.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 int x = 6;

 if( x % 2 == 0 ) {
  printf( "%i es par. \n", x );
 } else {
  printf( "%i es impar. \n", x );
 }

 return 1;
}
Notas:
Los números pares son múltiplos de 2. Si dividimos entre 2 un número par, el resto es 0. Si dividimos entre 2 un número impar, el resto es distinto de 0.
En C, el operador para calcular el cociente de la división es '/' y el operador para calcular el resto de la división es '%' (Válido para operaciones entre enteros (int). Si divides números enteros, el cociente es entero. Si necesitas el cociente con decimales, usa tipo float).

Ejercicio 9: Escribe un programa que muestre los números pares que hay entre el 2 y el 10.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 int numero;

 printf( "Pares entre 2 y 10: \n" );

 for( numero = 2; numero <= 10; numero++ ) {
  if( numero % 2 == 0 ) {
   printf( "%i \n", numero );
  }
 }

 return 1;
}
Notas:
El bucle for empieza con el número 2 y, se repite mientras 'numero' sea menor o igual que 10 (termina con el número 10), contando de 1 en 1.
Si el número es par, lo muestra.

Ejercicio 10: Escribe un programa que calcule y muestre la suma de los 100 primeros números naturales.
Solución:
#include <stdio.h>

int main (int argc, int *argv[]) {
 int sumador = 0, numero;

 for( numero = 1; numero <= 100; numero++ ) {
  sumador = sumador + numero;
 }

 printf( "Total: %i \n", sumador );

 return 1;
}

Nota: Cuando se usa una variable para realizar sobre ella operaciones de suma, se le llama 'sumador o acumulador'. Esta operación es muy común y puede realizarse con menos caracteres usando el operador asignación-suma (+=) -> 'sumador += numero;'. Además, hay que recordar inicializar la variable a 0 antes de realizar la operación, ya que el valor que tienen por defecto las variables en C es el valor que dejó en la celda el último programa que usó esa celda.
Ejercicio 11: Escribe un programa que calcule y muestre la suma de los números pares que hay entre 1 y 100 y, también la suma de los números impares que hay entre 1 y 100.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int numero, pares=0, impares=0;

 for( numero = 1; numero <= 100; numero++ ) {
  if ( numero % 2 == 0 ) {
   pares += numero;
  } else {
   impares += numero;
  }
 }

 printf( "Pares: %i \n", pares );
 printf( "Impares: %i \n", impares );

 return 1;
}
Ejercicio 12: Escribe un programa que muestre la tabla de multiplicar del 1 al 9, de los diez primeros números naturales.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int numero, multiplicando;

 for( numero = 1; numero <= 10; numero++ ) {
  for( multiplicando = 1; multiplicando <= 9; multiplicando++ ) {
   printf( "%i * %i = %i \n", numero, multiplicando, numero * multiplicando );
  }

  printf( "\n" );
 }

 return 1;
}
Ejercicio 13: Escribe un programa que calcule y muestre la suma de los múltiplos de 5 que hay entre 1 y 100 y, cuántos múltiplos de 5 hay entre 1 y 100.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int sumador = 0, contador=0, numero;

 for( numero = 5; numero <= 100; numero += 5 ) {
  sumador += numero;

  contador++;
 }

 printf( "Hay %i multiplos. \n", contador );
 printf( "Su suma es: %i \n", sumador );

 return 1;
}

Nota: En vez de contar de uno en uno y comprobar si es múltiplo de 5 (numero % 5 ==0) se cuenta de 5 en 5, que es mas eficiente.
Cuando una variable se incremente de uno en uno para contar, se le llama contador. Y es común usar para ello el operador pre-incremento (++contador) o post-incremento (contador++).
Ejercicio 14: Escribe un programa que calcule la ecuación 'y = x^3 + 8*x^2 + 3*x' usando como valores de x los múltiplos de 3 entre el 9 y el 60. El carácter '^' indica potencia (elevado a), pero ese operador no existe en C.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int x, y;

 printf( "y = x^3 + 8*x^2 + 3*x \n\n" );

 for( x = 9; x <= 60; x += 3) {
  y = x*x*x + 8*x*x + 3*x;

  printf("%i = %i^3 + 8*%i^2 + 3*%i \n", y, x, x, x);
 }

 return 1;
}

Nota: El bucle for recorre los múltiplos de 3 entre 9 y 60. La operación potencia se descompone en producto.
Ejercicio 15: Escribe un programa que muestre un número decimal sólo con dos decimales. Por defecto, se muestran 6 decimales.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 printf( "%.2f \n", 0.123456 );

 return 1;
}

Nota: La función printf permite indicar cuántos decimales mostrar. Se indica entre los caracteres '%f' con un punto seguido del número de decimales (.2).
Ejercicio 16: Escribe un programa que dibuje un rectángulo con '*'. El rectángulo debe tener 12 caracteres de ancho y 6 caracteres de alto.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 printf("************\n");
 printf("*          *\n");
 printf("*          *\n");
 printf("*          *\n");
 printf("*          *\n");
 printf("************\n");

 return 1;
}
Ejercicio 17: Escribe un programa que dibuje un rectángulo con '*'. Debe poder dibujarlo para cualquier ancho y alto.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int ancho = 6, alto = 4, i, j;

 // Lado superior.
 for( i = 1; i <= ancho; i++ ) {
  printf("*");
 }
 printf("\n");

 // Relleno.
 for( j = 2; j < alto; j++ ) {
  printf("*");

  for( i = 2; i < ancho; i++ ) {
   printf(" ");
  }

  printf("*\n");
 }

 // Lado inferior.
 for( i = 1; i <= ancho; i++ ) {
  printf("*");
 }
 printf("\n");

 return 1;
}

Nota: Se suelen usar i, j y k para los índices de bucles for (Normalmente no se superan 3 for anidados, uno dentro del otro).
Para poder incluir anotaciones junto al código fuente, se puede usar doble barra '//' para indicar que esa línea es un comentario. El compilador ignora esas líneas permitiendo incluir explicaciones que faciliten el entendimiento del código fuente.
Para dibujar el rectángulo se emplean dos tipos de líneas: Los lados superior e inferior (completo de '*') y, el resto (a los lados '*' con relleno de espacios en blanco). Primero se usa un bucle for para dibujar tantos '*' como diga la variable ancho. Después se necesitan dos bucles anidados: Uno recorre el alto (obviando los lados superior e inferior) y, el otro recorre el ancho (obviando los '*' laterales). Al final, se emplea otro bucle for que dibuja tantos '*' como diga la variable ancho.
Ejercicio 18: Escribe un programa que muestre los caracteres y su valor ASCII de los primeros 255 caracteres de la tabla ASCII.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int i;

 for( i = 0; i < 255; i++ ) {
   printf( "%i | %c \n", i, i );
 }

 return 1;
}

Nota: Si al ejecutar este ejemplo tu PC reproduce un sonido, es porque uno de los caracteres ASCII, que se llama 'BELL', le indica al PC que emita un pitido. Además, muchos de los caracteres son no imprimibles, por lo que mostrarán caracteres extraños.
Se ha usado un bucle for para recorrer desde el carácter número 0 hasta el carácter número 254. La función printf no sabe de qué tipo es la variable que le envías. Esto permite indicarle que interprete como carácter el valor entero. De esta forma, se puede mostrar la relación del código ASCII con su carácter. De hecho, el tipo de dato char en realidad almacena el código ASCII, que es lo que entiende el PC.
Ejercicio 19: Escribe un programa que muestre las parejas de números naturales cuya suma es 100. Éstos números están comprendidos entre el 0 y el 100:
0+100, 1+99, 2+98, ... 50+50.

Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int i, j;

 for( i = 0, j = 100; i < 50; i++, j-- ) {
  printf( "%i+%i, ", i, j );
 }
 printf( "%i+%i. \n", i, j );

 return 1;
}

Nora: En un bucle for se pueden inicializar varias variables y realizar incrementos (o decrementos) sobre ellas. En este caso se ha usado una variable 'i' para recorrer los números menores que 50 desde 0 y, 'j' para recorrer los números mayores que 50 desde 100.
Ejercicio 20: Escribe un programa que muestre los números pares divisibles entre tres que hay entre cero y cincuenta.
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 int i;

 for( i = 0; i <= 50; i++ ) {
  if( (i % 2 == 0) && (i % 3 == 0) ) {
   printf("%i \n", i);
  }
 }

 return 1;
}

Nota: Se pueden indicar varias condiciones usando el operador AND (&&). Esto es válido para las sentencias if, for, while...
Ejercicio 21: Escribe un programa que muestre todas las letras minúsculas (alfabeto inglés).
Solución:
#include <stdio.h>

int main( int argc, int *argv[] ) {
 char letra;

 for( letra = 'a'; letra <= 'z'; letra++ ) {
  printf( "%c ", letra );
 }
 printf( "\n" );

 return 1;
}

Nota: Los caracteres se indican entre comillas simples. Para el PC no es lo mismo el caracter 'a' que la cadena de texto "a". El PC entiende los caracteres como su código ASCII, es decir, como un número. Esto permite que se pueda trabajar con ellos como un número entero. Debido a que todos los caracteres en minúscula están seguidos en la tabla ASCII, se puede emplear un bucle for de 1 en 1.


< Página anterior - Siguiente página >



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

martes, 4 de octubre de 2011

5. Librerías en C

¿Qué son las librerías?
Son ficheros que contienen funciones y métodos que ya han sido creados por otros programadores. Nos agilizan en la creación de programas, pues no empezamos desde cero.
Contamos con muchas funciones agrupadas en distintas librerías según su utilidad. Las mas utilizadas son funciones matemáticas (librería math.h), y las de entrada y salida (stdio.h).
Las funciones de entrada y salida, nos permiten introducir datos por teclado y dibujar datos en la pantalla.
Entre las funciones matemáticas se encuentran potencia y raíz cuadrada. Son operaciones que el procesador no las tiene como instrucciones, y por lo tanto, hay que hacer un algoritmo que mediante bucles y operaciones básicas pueda obtener lo que queremos.

¿Cómo usar una librería?
Para usar una librería, hay que indicar su nombre de fichero. Se indican en las primeras líneas del código fuente de nuestro programa. Y se usa la etiqueta #include <nombre>.
Por ejemplo, la librería de entrada y salida se llama 'stdio.h'. Y para indicar que queremos incluirla en nuestro programa escribimos en la primera línea:
#include <stdio.h>

int main(int argc, char *argv[]) {
 return 1;
}
Dibujar en pantalla
Para dibujar en pantalla los datos, usamos funciones de salida. La mas usada es printf (contracción de print function).
Esta función dibuja en la consola de comandos (Para poder dibujar ventanas, botones y textos con estilo hacen falta otras librerías, que son complejas. Las interfaces gráficas suelen hacerse con otras tecnologías).
Nos permite dibujar textos estáticos o, dibujar un dato que esté almacenado en una variable. También se pueden mezclar los textos estáticos con los datos de variables, pero no es necesario u obligatorio. El texto fijo se escribe entre comillas dobles.
Dibujar un texto fijo:
#include <stdio.h>

int main(int argc, char *argv[]) {
 printf("Texto fijo de mi programa");

 return 1;
}
Dibujar el valor de una variable:
#include <stdio.h>

int main(int argc, char *argv[]) {
 int numero = 5;

 printf("%i", numero);

 return 1;
}
Notas:
Para dibujar el valor de una variable hay que especificar el tipo de dato. Se especifica entre comillas dobles, con el símbolo '%' seguido de la primera letra del tipo de dato. Para int es %i, para char es %c y para float es %f. Y separado por coma se indica el nombre de la variable.
Además, los caracteres que puede dibujar esta función son del teclado inglés (ASCII). Si le indicamos que dibuje una vocal con tilde (camión) no será capaz de dibujarla, y dibujará caracteres sin sentido en lugar de la 'ó'.


< Página anterior - Siguiente página >



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

miércoles, 21 de septiembre de 2011

4. Funciones y métodos en C

Funciones
Es un concepto que se refiere a un bloque de código con nombre, que recibe datos (uno o varios) y después de hacerles un tratamiento (ejecutar instrucciones) devuelve un único dato. Por ejemplo, si queremos hacer una función que sume dos números enteros, crearíamos un bloque de código que devuelve un entero, de nombre suma, que recibe dos enteros llamados 'numero1' y 'numero2', declara una variable para almacenar el resultado, y después devuelve el dato. En una función es obligatorio añadir la instrucción return.
int suma(int numero1, int numero2) {
 int resultado;

 resultado = numero1 + numero2;
 return resultado;
}

Métodos
Es un concepto que se refiere a un bloque de código con nombre, que recibe datos (uno o varios) y después de hacerles un tratamiento (ejecutar instrucciones) NO devuelve dato. Si queremos hacer un método que sume dos números enteros, la diferencia con la función es que se usa la palabra void para indicar que no devuelve dato, y no se añade la instrucción return.
void suma(int numero1, int numero2) {
 int resultado;

 resultado = numero1 + numero2;
}

Uso
Para ejecutar funciones y métodos se tienen que invocar (llamadas). Éstas llamadas se hacen a través de otros métodos y funciones. Por lo que todo método y función tiene como mínimo un padre, que efectúa la invocación. Por ejemplo, podemos crear la función suma, y un método que invoque a la función suma para calcular el resultado.
int suma(int numero1, int numero2) {
 int resultado;

 resultado = numero1 + numero2;

 return resultado;
}

void metodo(int numero1, int numero2) {
 int resultado;

 resultado = suma(numero1, numero2);
}
Función main
Hay una redundancia en el hecho de que todas las funciones y métodos tengan como mínimo un padre. Debe de haber uno de ellos que se ejecute primero. Entonces se ha propuesto una función como principal en C. Esta función recibe el nombre de main. Cuando ejecutamos nuestro programa, el sistema operativo busca la función main, y la ejecuta. A partir de ahí, las llamadas que hagamos dentro de la función main y las instrucciones que escribamos es cosa nuestra. Para indicar la función main, debemos escribirla con una sintaxis concreta. Hay varios tipos, pero lo mejor es escribir siempre la mas completa, que nos servirá para cualquier tipo de programa. El segundo dato que se le pasa a la función main '*argv[]' es un puntero a un array (aún no se ha explicado).
int main(int argc, char *argv[]) {
 int resultado;

 resultado = 1 + 2;

 return 1;
}
Nota: El valor a devolver por la función main no tiene relevancia, sólo permite que el sistema operativo sepa que el programa se ha terminado de ejecutar hasta la última instrucción (return siempre debe ser la última sentencia, ya que aborta la ejecución del programa). Los programadores suelen elegir el número 0 o el 1.
Ámbito de variables
Si tenemos varias funciones (o métodos) y en ellas declaramos variables con el mismo nombre, no hacen referencia a la misma parcela en la memoria. Porque cada función (o método) es independiente de otro. Aunque una función (o método) invoque a otra, no sabe lo que ésta hace internamente. El invocador sólo debe saber qué tipo de dato devuelve (para guardar el resultado en una variable del mismo tipo), el nombre de la función (o método), cuántos datos hay que introducirle a la función (o método), y de qué tipos de dato son.
int suma(int numero1, int numero2) {
 int resultado;

 resultado = numero1 + numero2;

 return resultado;
}

void metodo(int a, int b) {
 int resultado;

 resultado = suma(a, b);
}
Nota: En el método se puede ver como los datos que hay en las variables 'a' y 'b' se introducen en la función suma. Sin embargo en la función las variables donde recibe los datos se llaman 'numero1' y 'numero2'. Hay que tener en cuenta que lo que se introduce en la función son los valores que contienen las variables. Y cuando se reciben, se almacenan en variables que pertenecen a la función, y no al método que la ha invocado. Aunque tengan el mismo nombre, son variables distintas. Una variable pertenece al bloque de código en el que se declara. Esto se llama ámbito de variable. Por ejemplo, la variable 'numero1' tiene su ámbito en la función suma solamente.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.

    Si quieres programar en Windows.



< Página anterior - Siguiente página >



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

3. Sintaxis de C (II)

Sintaxis de palabras clave
  • break
  • Cuando el procesador se encuentra con esta sentencia, aborta la ejecución del bloque de código en el que se encuentra. Está restringida por las técnicas de programación. Sólo se permite su uso con la palabra reservada switch. Donde separa cada conjunto de instrucciones.
  • case
  • Sentencia miembro de switch. Se encarga de separar cada conjunto de instrucciones.
  • default
  • Sentencia miembro de switch. Es la equivalente a la instrucción else. Se encarga de separar el último conjunto de instrucciones que se ejecuta cuando ninguna de las anteriores condiciones es verdadera.
  • switch
  • Para las estructuras selectivas podríamos usar siempre la sentencia if. Pero en algunos casos, en los que todas las condiciones son referidas a la misma variable y de igualdad, facilita la escritura. Es una instrucción para elegir qué conjunto de instrucciones se van a ejecutar según la condición. La sentencia sólo dispone de un bloque de código separado por varios conjuntos de instrucciones. Mientras la sentencia if selecciona entre bloques de código a ejecutar, la sentencia switch selecciona entre conjuntos de instrucciones. Las instrucciones se agrupan en conjuntos que comienzan por case y terminan con break.
int precio_pan;
precio_pan = 3;

switch(precio_pan) {
 case 1:
  1+1;
 break;

 case 2:
  2+2;
 break;

 default
  2-2;
 break;
}

Nota: Si 'precio_pan' vale 1, se ejecuta el primer conjunto de instrucciones. Si vale 2, se ejecuta el segundo, y así sucesivamente. Si no concuerda con ninguno de los valores de case, se ejecuta el conjunto default.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.
    Si quieres programar en Windows.
  • do
  • Es una sentencia de bucle, que va acompañada de la sentencia while. La diferencia, es que la sentencia while se coloca después del bloque de código. Al estar la condición al final, el bloque se ejecutará siempre una vez como mínimo.
int repeticiones;
repeticiones = 0;

do {
 2+2;

 repeticiones--;
} while (repeticiones > 0);
Nota: Aunque 'repeticiones' vale 0 antes del bloque de código, se ejecuta una vez, ya que la condición se evalúa después de la primera ejecución del bloque.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.

    Si quieres programar en Windows.
  • for
  • Es una sentencia de bucle. Cuando los bucles se deben repetir un número de veces determinado, el cuál podemos conocer, facilita su escritura. Entre paréntesis se incluyen tres partes, separadas por ';'. La primera parte indica el valor de inicio de la variable que va a indicar el número de veces que se repetirá. La segunda parte indica la condición que pondríamos en while. Y en la tercera parte se coloca la modificación de la variable, que situaríamos como última línea del bloque de código de while.
int repeticiones;

for (repeticiones = 3; repeticiones > 0; repeticiones--) {
 2+2;
};
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.

    Si quieres programar en Windows.

  • enum
  • Se considera un tipo de dato (dato enumerado). Su utilidad consiste en acotar los valores que puede tener una variable. Por ejemplo, si quisiéramos representar los estados sólido, líquido y gaseoso y que no podamos añadir ningún valor mas, podemos hacerlo con este tipo de dato. La palabra clave enum no declara una variable como int, char o float. Lo que hace es crear un tipo de dato. Y con ese tipo de dato, al que le hemos dado un nombre, declaramos una variable de tipo enumerado, que puede tomar sólo los valores que le hayamos indicado.
enum estado {
 solido, liquido, gaseoso
};

enum estado agua;

agua = solido;

if (agua == solido) {
 agua = liquido;
}

if (agua == liquido) {
 agua = gaseoso;
}

if (agua == gaseoso) {
 2+2;
}
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.

    Si quieres programar en Windows.

  • struct
  • Al igual que enum, esta palabra reservada crea un tipo de dato, pero no una variable. Su utilidad es agrupar variables que tienen relación entre sí. Por ejemplo, si queremos almacenar datos sobre una persona, como su peso y su edad, necesitamos dos variables de distinto tipo. La palabra struc permite crear una estructura que agrupe las dos variables.
struct tipo_persona {
 float peso;
 int edad;
};

struct tipo_persona persona;

persona.peso = 70.4;
persona.edad = 27;

if (persona.edad >= 18) {
 2+2;
}
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.

    Si quieres programar en Windows.



< Página anterior - Siguiente página >



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

martes, 20 de septiembre de 2011

2. Sintaxis de C (I)

¿Qué necesitas para programar en C?
  • Editor de texto plano.
  • Para escribir el código fuente.
  • Compilador de C.
  • Para traducir el código fuente y transformar el archivo de texto en un archivo ejecutable.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.
    Si quieres programar en Windows.
Instrucciones
Toda instrucción debe finalizar con el carácter ';'.
Para introducir un valor en una variable se utiliza el operador '='. Ejemplo: nombre_variable = valor;
Los tipos de datos enteros se representan con su número. Ejemplo: 1.
Los tipos de datos letra se representan entre comillas simples. Ejemplo: '1'.
Los tipos de datos decimales se representan separando la parte decimal con un punto. Ejemplo: 1.0.
Nota: Ten en cuenta que para los humanos en los tres casos (1, '1', 1.0) son el mismo dato pero representados de distinta forma. La computadora no lo entiende. Para ella dos tipos de datos distintos no pueden representar lo mismo.

Nombres de variables
Hay restricciones para elegir nombres de variables. No deben coincidir con las palabras clave del lenguaje y deben estar compuestas de "una o más letras ASCII, dígitos numéricos (que en ningún caso deben aparecer como primer carácter) y barras bajas" 1.

Sintaxis de palabras clave
Las palabras clave auto, const, extern, long, register, signed, short, static, unsigned y volatile hacen referencia al ámbito, acceso y opciones especiales de las variables. No las explicaré porque en mi opinión resultarían una complicación innecesaria.

Las palabras clave goto y continue están prohibidas por las técnicas de programación (programación estructurada), por lo que no las explicaré.

Las palabras clave typedef y union tienen relación con struct, pero pueden obviarse sin perder funcionalidad, por lo que no las explicaré.
  • int
  • Reserva espacio en memoria de tipo integer (Número entero). Es obligatorio acompañarlo de un nombre de variable.
int precio_pan;
precio_pan = 1;
  • char
  • Reserva espacio en memoria de tipo character (letra, carácter). Es obligatorio acompañarlo de un nombre de variable.
char precio_pan;
precio_pan = '1';
  • float
  • Reserva espacio en memoria de tipo floating point (Números decimales en coma flotante). Es obligatorio acompañarlo de un nombre de variable.
float precio_pan;
precio_pan = 1.0;
  • double
  • Reserva espacio en memoria de tipo double precision floating point (Números decimales en coma flotante con doble presición). Permite almacerar números con mas dígitos decimales. Es obligatorio acompañarlo de un nombre de variable.
double precio_pan;
precio_pan = 1.0;
  • sizeof
  • Para preguntar cuanto espacio ocupa en memoria un tipo de dato o una variable (da igual si está vacía, el espacio que ocupa una variable es el espacio reservado en memoria). El elemento sobre el que le preguntemos, lo debemos colocar entre paréntesis. El resultado se perderá si no lo guardamos en una variable.
int precio_pan;
int espacio_en_memoria1;
int espacio_en_memoria2;
espacio_en_memoria1 = sizeof(int);
espacio_en_memoria2 = sizeof(precio_pan);
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.
    Si quieres programar en Windows.
  • Bloques de código, void, return
  • Un bloque de código puede contener otros. Puede tener nombre o ser anónimo. Pueden recibir datos (Varios y de distinto tipo) de un bloque y devolverle un valor (pero sólo uno). Las instrucciones se escriben en los bloques de código. Los bloques de código van entre llaves. void se utiliza cuando el bloque no recibe datos y/o no devuelve datos.
Ejemplo de bloque anónimo:
{
 int suma;

 suma = 2 + 2;
}
Nota: No tiene sentido por sí solo. Debe de estar junto a las instrucciones for, if, while.
Ejemplo de bloque con nombre:
int dos_mas_dos(void) {
 int suma;

 suma = 2 + 2;

 return suma;
}

Nota: Las reglas para elegir nombre de bloque son las mismas que para las variables. El primer int significa que devuelve un dato de tipo entero. La palabra void indica ningún dato. Al colocarlo entre paréntesis indica que no recibe ningún dato. La palabra return indica el dato a devolver.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.
    Si quieres programar en Windows.
  • if, else
  • Mediante una condición, que puede ser verdadera o falsa, permite la selección de un bloque de código entre varios. Cada bloque tendrá una condición, que si es verdadera permitirá que se ejecute. Si queremos que se ejecute un bloque cuando no se haya dado ninguna de las condiciones anteriores, se usa la instrucción else. No es obligatorio usar else.
Ejemplo sin 'else':
int precio_pan;
precio_pan = 1;

if (precio_pan > 1) {
 2+2;
}

Ejemplo con 'else':
int precio_botella_leche;
precio_botella_leche = 1;

if (precio_botella_leche == 1) {
 2+2;
} else {
 2-2;
}
Nota: Recuerda que para expresar igualdad en una condición se usa el operador '==' ya que el '=' se usa para asignación. La instrucción else en este ejemplo sería verdadera cuando 'precio_botella_leche' fuese distinto de 1.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.
    Si quieres programar en Windows.

  • while
  • Mediante una condición, que puede ser verdadera o falsa, permite la ejecución recursiva de un bloque de código completo. Mientras la condición sea verdadera, se volverá a ejecutar el bloque de código asignado. Si la condición siempre es verdadera, el bloque de código se ejecuta indefinidamente y provoca un error de lógica del programa. Es muy importante asegurarse de que la condición no va a ser verdadera siempre.
int repeticiones;
repeticiones = 2;

while(repeticiones > 0) {
 2+2;

 repeticiones = repeticiones - 1;
}
Nota: Debemos cambiar el valor de la variable 'repeticiones' dentro del bucle para evitar que la condición sea siempre verdadera. Al reducirlo en una unidad por cada repetición, conseguimos que se repita el número exacto de veces que queramos.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux.
    Si quieres programar en Windows.

< Página anterior - Siguiente página >

Referencias
1. http://es.wikipedia.org/wiki/Identificador



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

martes, 13 de septiembre de 2011

1. Vocabulario de C

Vocabulario
El vocabulario del lenguaje C está formado por un conjunto de 32 palabras clave (en idioma inglés), y una serie de operadores.
Las palabras clave son:
auto     break    case     char   const    continue default
do       double   else     enum   extern   float    for 
goto     if       int      long   register return   short
signed   sizeof   static   struct switch   typedef  union
unsigned void     volatile while

Tipos de datos
Cuando reservamos memoria para un dato, tenemos que especificar el tipo de dato. Y los tipos de datos que nos permite C son números enteros (int), números decimales (float) y letras (char).

Reservar memoria
Para poder usar la memoria, debemos reservar parcelas. Cuando le ordenamos a la computadora que reserve memoria y le asignamos un nombre, se llama declaración de variables.


< Página anterior - Siguiente página >



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

viernes, 9 de septiembre de 2011

Tema 1: Aprende a programar desde cero

Índice
1. ¿Qué es un programa?
2. ¿Cómo se ejecuta un programa?
3. Características de un programa
4. Lenguajes de programación


Ir a menú principal

4. Lenguajes de programación

Diferencias entre lenguajes
Cada lenguaje de programación tiene un enfoque distinto. Por ejemplo, algunos dan mas importancia a los datos (la mayoría de sus instrucciones son para manejar datos), algunos dan mas importancia a los gráficos (la mayoría de sus instrucciones son para dibujar ventanas, botones).
A la hora de elegir uno, lo que importa realmente es que pienses para qué sistema operativo (Windows, GNU/Linux, MacOS) quieres hacerlo, y si quieres que sea de ejecución local o en la nube (Internet).
Aunque las instrucciones dependen en realidad del procesador, cada lenguaje puede expresarlas a su manera e incluir las que interesen.  Para realizar una instrucción del procesador, dos lenguajes pueden usar palabras distintas.

Características comunes en todos los lenguajes:
  • Instrucciones de operación matemática.
  • Disponemos de la suma, la resta, la multiplicación y la división. Las demás operaciones matemáticas se pueden conseguir a partir de éstas, pero no existen como instrucciones.
  • Operación de asignación.
  • Para guardar un dato en una variable, se utiliza la operación de asignación.
  • Bloques de código.
  • Cada bloque de código corresponde a un algoritmo. Un programa puede contener varios bloques.

¿Qué lenguaje elegir para empezar a aprender?
Desde mi punto de vista, se debe de empezar con el lenguaje de programación C (No confundir con C++ ni C#). Cuenta con instrucciones a un nivel lo suficientemente bajo para comprender los procesos de una computadora y el suficientemente alto para no tener que pensar en operaciones rutinarias (Precisamente las operaciones que intentamos evitar del lenguaje máquina).

Técnicas de programación
No son elementos de los lenguajes de programación. Pero con la experiencia, los programadores se dan cuenta de que la elaboración de programas puede volverse caótica.
La forma correcta de hacer un programa es seguir una técnica de programación. La más básica es la programación estructurada, que implica seguir 3 normas:
  1. Secuencia. Las instrucciones dentro de un bloque deben seguir un orden concreto y ejecutarse una detrás de otra.
  2. Instrucción condicional. Se permite desviar el flujo de ejecución entre bloques.
  3. Iteración (bucle de instrucciones) con condición al principio. Se permite repetir la ejecución de un bloque tantas veces como se quiera.


< Página anterior - Siguiente página >



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

jueves, 8 de septiembre de 2011

3. Características de un programa

Lenguaje de un programa
El único lenguaje que entiende una computadora, es el lenguaje máquina. Ese lenguaje es complicado para los humanos. Escribir los programas en lenguaje máquina sería demasiado tedioso.
Para facilitar la elaboración de programas, se han diseñado los lenguajes de programación. Son lenguajes intermedios entre el lenguaje humano y el lenguaje máquina. Son mas fáciles de manejar para los humanos y además su semántica, sintaxis y gramática están pensadas para seguir estructuras lógicas.
Sin embargo, las computadoras no entienden esos lenguajes. Hace falta un programa que traduzca el lenguaje de programación a lenguaje máquina.

Proceso de elaboración
  1. Escribir el programa en un archivo de texto plano (llamado código fuente).
  2. Ejecutar el programa de traducción para obtenerlo en lenguaje máquina. El proceso de traducción puede ser de tres tipos:
    1. Compilación
    2. Interpretación
    3. Pseudocompilación


    < Página anterior - Siguiente página >



    Licencia de Creative Commons
    Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

    2. ¿Cómo se ejecuta un programa?

    ¿Dónde se ejecutan los programas?
    Volviendo a la comparación con las recetas de cocina, una receta está pensada para que la lleve a cabo una persona. Por lo que la descripción de ésta debe ser fácil de interpretar por una persona.
    En el caso de los programas, es la computadora la que se encarga de ejecutarlos. Por lo que su descripción debe ser fácil de interpretar por una computadora.

    Funcionamiento de una computadora
    Si pretendemos hacer programas, debemos conocer cómo funcionan los ordenadores internamente. Así podremos crear algoritmos que las computadoras puedan entender.

    Procesador: Se encarga de ejecutar las instrucciones. Los procesadores tienen una cantidad de instrucciones finita (Juego de instrucciones).
    Memoria RAM: Se encarga de almacenar los datos iniciales, el resultado final y las operaciones intermedias.
    Esta memoria es muy rápida, por lo que hace buena pareja con el procesador. Sin embargo, esta memoria es volátil. Por lo que no es un sitio seguro para almacenar datos de forma prolongada.
    Disco duro: Su acceso es demasiado lento para colaborar con el procesador en sus operaciones. Pero su misión consiste en almacenar los datos de forma permanente. Puesto que las operaciones intermedias suelen no tener importancia por sí mismas, en los discos duros se almacenan los datos iniciales y los resultados.
    Teclado: Los datos deben de introducirse en la computadora. Para ello hay una gran variedad de dispositivos. El más común, por ser de propósito general, es el teclado.
    Desde él podemos introducir letras, números, palabras, etc.
    Monitor: Para que los resultados tengan utilidad, debemos de poder visualizarlos. Hay varios dispositivos que permiten interpretar los datos. El más común, por ser de propósito general, es el monitor.
    Por medio de píxeles permite dibujar una representación de los datos.

    Implementación de un programa
    Debemos analizar cómo llevar a cabo un programa.

    Necesitamos usar la memoria (RAM) para guardar tanto los datos iniciales, como las operaciones intermedias y el resultado final. Para eso, creamos parcelas en la memoria que funcionan de recipientes para los datos.
    La operación de crear una parcela se llama "reservar espacio en memoria para un dato".
    Debemos indicar de qué tipo es la parcela (número entero, número decimal, letra, palabra), pues no se reserva la misma memoria para todos.
    A esa parcela, le podemos dar un nombre. Por ejemplo precio_pan. Entonces podemos decir que precio_pan es una variable, porque esa parcela puede almacenar diferentes valores (aunque sólo un valor a la vez). El nombre se sustituye internamente por el valor que contiene en ese momento.
    Nota: Es importante diferenciar que la variable, aunque tenga el nombre del dato, no es el dato. El dato es el valor y la variable es el recipiente.


    < Página anterior - Siguiente página >



    Licencia de Creative Commons
    Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

    1. ¿Qué es un programa?

    Concepto
    No hay que perder de vista que la finalidad de un programa (informático) es hacer un tratamiento a unos datos.
    Pues los ordenadores o computadoras son máquinas que trabajan con datos. Pueden almacenarlos y hacerles algún tratamiento.
    Por ejemplo: Si son números puedes obtener su suma.

    Estructura
    Para entender la estructura de un programa, podemos fijarnos en la estructura de algo mas cotidiano.
    Por ejemplo, ver las similitudes con las recetas de cocina.
    Las recetas de cocina pueden considerarse algoritmos. "Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema" 1.

    Vamos a diferenciar 3 partes en una recta de cocina:
    1. Los ingredientes -> Material necesario para conseguir el plato final.
    2. Pasos a seguir    -> Tareas necesarias para obtener el plato final a partir de los ingredientes.
    3. Plato final           -> Resultado que se pretende obtener después de aplicar los pasos a los ingredientes.
    Ejemplo de receta de cocina
    Objetivo: Tortilla de patatas.
     Ingredientes
     -4 huevos
     -2 cucharadas soperas de aceite de oliva
     -Una pizca de sal
     -3 patatas
     -1 cucharada de Mahonesa Calvé
     Preparación
     -Cortar las patatas en rodajas finas y freír en abundante aceite.
     -Cuando estén doradas, retirar y poner en un plato.
     -Batir los huevos y añadir la cucharada de Mahonesa Calvé y una pizca de sal.
     -Mezclar en una sartén hasta que se cueza y voltear.
     -Servir en un plato, una vez esté dorada al gusto.
     Resultado
     -Tortilla de patatas.

    Ahora vamos a diferenciar 3 partes en un programa:
    1. Los datos        -> Material necesario para conseguir un resultado.
    2. Pasos a seguir -> Tareas (llamadas en informática "instrucciones") necesarias para obtener un dato (o datos) después de aplicar las instrucciones a los datos.
    3. Resultado       -> Se pretende obtener un dato (o datos)  a partir de los datos iniciales.



    Ejemplo de programa (o algoritmo)
     Objetivo: Obtener el precio total de la lista de la compra.
     Datos
     -Precio de una barra de pan.
     -Precio de una botella de leche.
     -Precio de un paquete de galletas.
     Instrucciones
     -Sumar el precio de una barra de pan con el precio de una botella de leche.
     -Guardar el resultado.
     -Sumar el resultado anterior con el precio de un paquete de galletas.
     -Guardar el resultado.
     Resultado
     -Precio total de la lista de la compra.


    < Página anterior - Siguiente página >

    Referencias
    1. http://es.wikipedia.org/wiki/Programaci%C3%B3n#Programas_y_algoritmos



    Licencia de Creative Commons
    Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.