viernes, 6 de septiembre de 2013

Módulos

Como vimos anteriormente C tiene como bloque básico la función main(), también hemos visto la sentencia printf() que es otra función, y de igual forma hay muchas más funciones predefinidas, pero nosotros mismos también podemos definir nuestras propias funciones. 

La forma general de definición de una función es: 
        
        tipo nombre(lista de parámetros) 
        {
               cuerpo de la función
        }

El tipo especifica el tipo de valor que devuelve la sentencia return de la función. El valor puede ser cualquier tipo válido; si no se especifica ninguno, se asume un resultado entero.


  • Funciones sin parámetros
 La lista de parámetros es la lista de nombres de variables separados por comas con sus tipos asociados que reciben los valores de los argumentos cuando se llama a la función. Puede no tener parámetros, en ese caso la lista de parámetros está vacía; sin embargo los paréntesis son necesarios.

             void mi_funcion( )
       {
          bloque de sentencias
       }


  • Prototipos de funciones
Los prototipos de las funciones que se utilizan en un programa se incluyen generalmente en la cabecera del programa. En el prototipo de una función no se especifican las sentencias que forman parte de la misma, sino sus características. Por ejemplo:
        
      int cubo (int);

En este caso se declara la función cubo que recibe como parámetro una variable de tipo entero y devuelve un valor del mismo tipo. En ningún momento estamos especificando qué se va hacer con la variable, sólo declaramos las características de la función. 

Los prototipos de las funciones son utilizados por el compilador para verificar que se accede a la función de la manera adecuada con respecto al número y tipo de parámetros, y al tipo de valor de retorno de la misma.

  • Parámetro por valor y por referencia
Por valor significa que la función (o subrutina) recibe sólo una copia del valor que tiene la variable, o sea que no la puede modificar.

Por referencia significa que se pasa la posición de memoria donde está guardada la variable, por lo que la función puede saber cuánto vale, pero además puede modificarla de cualquier manera.

Ejemplos:

#include <stdio.h>
#include <conio.h>

/*Programa que dados dos números enteros determine la suma y cual de ellos es mayor, usando dos funciones diferentes.*/

void suma (int a, int b); /*Declaración de la función*/
void mayor (int a, int b); /*Tipo de dato, nombre de la función y el tipo y nombre de los argumentos*/

main()
{

   int a, b;

   printf("Ingrese el valor de a:\n");
   scanf("%d", &a);
   printf("Ingrese el valor de b:\n");
   scanf("%d", &b);

   suma(a,b); /*Llamado de la función*/
   mayor(a,b); /*Unicamente el nombre de la función y de los parámetros*/

   getch();
   return 0;
}

void suma(int a, int b) /*Definición de la función*/
{ /*Abrimos llaves al inicio de la definición*/
   int sum; /*Declaración de las variables locales*/

   sum=a+b;
   printf("El valor de la suma es %d:\n\n", sum);
} /*Fin de la funci¢n suma*/

void mayor(int a, int b)
{ 
   if(a==b)
      printf("Son iguales\n\n");
   else {      if(a>b)
         printf("El valor de a es mayor que el de b\n\n");
      else
         printf("El valor de b es mayor que el de a\n\n");
   }
}





jueves, 5 de septiembre de 2013

Arreglos y cadenas

  • Arreglos

Los arreglos son una colección de variables del mismo tipo que se referencían utilizando un nombre común. Un arreglo consta de posiciones de memoria contigua. La dirección más baja corresponde al primer elemento y la más alta al último. Un arreglo puede tener una o varias dimensiones. Para acceder a un elemento en particular de un arreglo se usa un índice.

El formato para declarar un arreglo unidimensional es:

      tipo nombre_arreglo [tamaño];
  int miarreglo[10];

En C, todos los arreglos usan cero como índice para el primer elemento. Para acceder al primer elemento utilizaríamos miarreglo[0], el segundo; mi arreglo[1] ... y así sucesivamente 

Lo más común para recorrer un arreglo es utilizando un ciclo for, por ejemplo si queremos llenar un arreglo con números:

for(int i = 0; i < 10; i++)
{
     miarreglo[i] = i+1;
}

Esto llenaría el arreglo con los números del 1 al 10.


  • Cadenas
A diferencia de otros lenguajes de programación que emplean un tipo denominado cadena (string) para manipular un conjunto de símbolos, en C, se debe simular mediante un arreglo de caracteres, en donde la terminación de la cadena se debe indicar como nulo ('\0').

El  formato para declarar una cadena es:

     char nombre_cadena [tamaño];
  //Estas dos formas son ejemplos para inicializar la cadena
  char nombre_cadena [tamaño] = "cadena";
  char nombre_cadena [tamaño] = { "cadena" };


El lenguaje C automáticamente asigna el caracter nulo al final de la cadena, pero es importante tenerlo en cuenta al indicar el tamaño de la cadena.

      char cadena[5] = "hola"; 
      //que sería equivalente a:
      char cadena[5] = { 'h', 'o', 'l', 'a', '\0'};


  • Matrices
Una matriz es una estructura de datos, o más técnicamente, un espacio de memoria que permite almacenar una colección de elementos, todos del mismo tipo. La diferencia con los arreglos está en que, en las matrices, los elementos no están organizados linealmente sino que su organización es bidimensional, es decir, en filas y columnas. 

El formato para declarar una matriz es:

   tipo nombre_matriz [nFilas][nColumnas];

En C se permite la inicialización de arreglos como los siguientes:
      int matriz[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
      matriz[2][0] = 100;

Para recorrer una matriz se utilizan dos ciclos for (uno anidado dentro de otro). El primer for sería para recorrer la filas y el segundo para las columnas. 

Ejemplos

  • Vectores
#include <stdio.h>
int mi_arreglo[] = { 1, 23, 17, 4, -5, 100};
int main()
{
int i;

for( i = 0; i < 6; i++)
{
printf("mi_arreglo[%d] = %d ", i, mi_arreglo[i]);
}
return 0;
}
Matrices #include <stdio.h>
#define RENGLONES 5
#define COLUMNAS 10
int multi[RENGLONES][COLUMNAS];
int main(void)
{
int renglon, columna;
for (renglon = 0; renglon < RENGLONES; renglon++)
{
for (columna = 0; columna < COLUMNAS; columna++)
{
multi[renglon][columna] = renglon*columna;
}
}
for (renglon = 0; renglon < RENGLONES; renglon++)
{
for (columna = 0; columna < COLUMNAS; columna++)
{
printf("\n%d ",multi[renglon][columna]);
printf("%d ",*(*(multi + renglon) + columna));
}
}
return 0;
}
Cadenas#include <stdio.h>
/*Este programa copiará caracter por caracter la cadena strA a la cadenaB
char strA[80] = "Cadena a usar para el programa de ejemplo";
char strB[80];
int main(void)
{
int i=0;
puts(strA);
putchar('\n');
while(i <= 80)
{
strB[i] = strA[i];
i++;
}
printf("La cadena inicial es: %s", strA);
printf("La cadena copiada es: %s", strB);
}


#include <stdio.h>
int mi_arreglo[] = { 1, 23, 17, 4, -5, 100};

int main()
{
   int i;
   
   for( i = 0; i < 6; i++)
   {
     printf("mi_arreglo[%d] = %d ", i, mi_arreglo[i]);
   }

   return 0;
}

  • Matrices 
#include <stdio.h>

#define RENGLONES 5
#define COLUMNAS 10
int multi[RENGLONES][COLUMNAS];

int main(void)
{
 int renglon, columna;
 for (renglon = 0; renglon < RENGLONES; renglon++)
 {
   for (columna = 0; columna < COLUMNAS; columna++)
   {
       multi[renglon][columna] = renglon*columna;
   }
 }
 for (renglon = 0; renglon < RENGLONES; renglon++)
 {
     for (columna = 0; columna < COLUMNAS; columna++)
     {
         printf("\n%d ",multi[renglon][columna]);
         printf("%d ",*(*(multi + renglon) + columna));
      }
 }
 return 0;
}

  • Cadenas
#include <stdio.h>
/*Este programa copiará caracter por caracter la cadena strA a la cadenaB
char strA[80] = "Cadena a usar para el programa de ejemplo";
char strB[80];

int main(void)
{
   int i=0;
   puts(strA); 
   putchar('\n'); 

   while(i <= 80)
   {
      strB[i] = strA[i];
      i
   }
}

martes, 3 de septiembre de 2013

Entrada y salida de datos

Las entradas y salidas de datos se realizan a través de funciones de bibliotecas (específicamente la biblioteca stdio.h. Las funciones principales que realizan la entrada y salida sin formato son:

getchar(): Lee un caracter del teclado. Espera hasta que se pulsa una tecla y entonces devuelve su valor.
putchar(): Imprime un caracter en la pantalla en la posición actual del cursor.
gets(): Lee una cadena de caracteres introducida por el teclado y la sitúa en una dirección apuntada por el argumento de tipo puntero a caracter.
puts(): Escribe un argumento de tipo cadena en la pantalla seguida de un salto de línea.

Las funciones que realizan entrada y salida con formato son:

printf(): Escribe datos en la consola con el formato especificado.

Sintaxis: printf(cadena_de_control, arg1, arg2, ..., argn);

La cadena_de_control contiene la información sobre el formato de salida de los argumentos, los cuales pueden ser constantes, variables, arrays, referencias de funciones o cualquier expresión. La cadena_de_control está compuesta por grupos de caracteres, donde cada grupo encabezado por el símbolo (%) representa el formato del dato de salida. En la cadena de control, se puede intercalar texto si formato para comentar las salidas.

Códigos de los formatos posibles.
Formato Visualización del dato.
%c Carácter
%s una cadena de caracteres.
%d Entero decimal con signo
%o Entero en octal (sin 0)
%u Entero decimal sin signo
%x Entero en hexadecimal (sin 0X)
%f Coma flotante.
%e Coma flotante en notación científica.
%g Coma flotante sin cero ni coma si es el caso.

%p Dirección del puntero.


scanf(): Función de entrada por consola con el formato especificado

Sintaxis: scanf(cadena_de_control, arg1, arg2, ..., argn);

La cadena_de_control contiene la información sobre el formato de las entradas y son
idénticos a los formatos vistos en la función printf(). Pero, los argumentos; arg1, arg2, etc,
son direcciones de las variables y para ellos se debe utilizar el operador de las direcciones (&).
Cuando se trata de capturar un array de datos, lo argumentos no debe ir precedido por el

ampersand (&), ya que el propio nombre del array indica la dirección del mismo.

Ejemplo:

    #include <stdio.h>
    main()
    {
       char cadena[10];
       char caracter;
       int i;
       i=getchar();
       putchar(i);
       gets(cadena);
       puts(cadena);
       scanf("%c", &caracter);
       printf("%c",caracter);
     }