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.