sábado, 26 de noviembre de 2011

Funciones y Procedimientos

Las funciones y los procedimientos son muy importantes a la hora de programar así cómo conocer bien que son los argumentos y cómo se usan, con este pequeño resumen espero que os ayude a entenderlos mejor.


Funciones y procedimientos:

          Las dos formas clásicas de subprogramas, disponibles prácticamente en cualquier lenguaje imperativo, son las funciones y los procedimientos.

Concepto de subprograma:

Un subprograma, como su propio nombre indica, es una parte de un programa. Un subprograma sirve para resolver un subproblema.

La técnica de refinamientos sucesivos sugiera descomponer las operaciones complejas de un programa en otras más simples.

Las dos formas fundamentales de subprogramas en programación imperativa son las funciones y los procedimientos.

Funciones:

Una función es un tipo de subprograma que calcula como resultado un valor único a partir de otros valores dados como argumentos.

El primer paso en el manejo de una función es declarar su interfaz. Esta declaración incluye su nombre, los argumentos que necesita con el correspondiente tipo para cada uno de ellos, y el tipo de resultado que proporciona.

Ejemplo:

          int edad (int nacimiento, int fechaactual)


Los argumentos que aparecen en la cabecera son los argumentos formales. La definición completa de una función se compone de una cabecera seguida de un cuerpo de función que tiene la misma estructura que un bloque de programa completo. Este bloque comienza con una parte declarativa y continúa con una parte ejecutiva. En la parte declarativa se pueden declarar constantes y variables locales que sólo son visibles en el cuerpo de la función. La parte ejecutiva estará constituida por una secuencia de sentencias. En las sentencias que constituyen el cuerpo de la función se puede y se debe hacer uso de los argumentos formales declarados en su interfaz.



          Uso de funciones:

Para usar un función en los cálculos de un programa se invoca dicha función escribiendo su nombre y a continuación, entre paréntesis, los valores concretos de los argumentos, separados por comas.

Existen funciones predefinidas en el propio lenguajes que están siempre disponibles en cualquier programa. Son en general seudofunciones.


Procedimientos:

Un procedimiento es un subprograma que realiza una determina acción. A diferencia de las funciones, un procedimiento no tiene como objetivo en general, devolver un valor obtenido por cálculo. Un procedimiento es una forma de subprograma que agrupa una sentencia o grupo de sentencias que realizan una acción, y permite darles un nombre por el que las pueden identificar posteriormente. Otra forma de ver a los procedimientos es como acciones parametrizadas.

La definición de un procedimiento es prácticamente igual a la de una función, la diferencia principal es que no se declara el tipo de valor del resultado, ya que no existe dicho valor. La palabra reservada void es la que indica que no hay resultado de ningún tipo. Además, con cierta frecuencia interesa definir procedimientos sin argumentos. En estos casos sólo es necesario dar el nombre y no habrá lista de argumentos entre los paréntesis.

Si se desea, en la definición de un procedimiento pueden usarse también sentencias de retorno, pero con un significado algo diferente que en el caso de las funciones. La sentencia return; sirve para terminar la ejecución del procedimiento en ese momento y volver al punto siguiente donde se invocó.

Ejemplo:

          void escribiralgo () {

                    printf (“algo”);

          }



Uso de procedimientos:

Para usar un procedimiento hay que invocarlo. Dicha invocación o llamada constituye por sí sola una sentencia. Un procedimiento se invoca escribiendo su nombre y a continuación, si los hay, los valores de los argumentos particulares en esa llamada, separados por comas. Los valores de los argumentos pueden darse, en general, mediante expresiones. Si no hay argumentos s su suprimen los paréntesis. Los argumentos en la llamada (argumentos reales) deberán ser compatibles con los indicados en la declaración (argumentos formales).

Ejemplo de invocación de un procedimiento:

          escribiralgo();



Paso de argumentos:

          La manera fundamental de comunicar información entre las sentencias de un subprograma y el programa que lo utiliza es mediante los argumentos. Existen dos formas de realizar esta comunicación, paso por valor y paso por referencia.



Paso por valor:

Los argumentos representan valores que se transmiten desde el programa que llama hacia el subprograma. En el caso de las funciones hay además un valor de retorno, que es el valor de la función que se transmite desde el subprograma hacia el programa que lo llamó.



Paso por referencia:

El mecanismo de paso por valor no permite que el subprograma modifique directamente una variable. Para conseguirlo hay que usar el paso de argumentos por referencia. El paso de un argumento por referencia se indica en la cabecera del subprograma, anteponiendo el símbolo & al nombre del argumento formal. Si un argumento se pasa por referencia ya no será válido usar como argumento real una expresión. El argumento real usado en la llamada deber ser necesariamente una variable del mismo tipo. Esta variable será utilizada en el subprograma como si fuera suya, es decir, la asignación del nuevo valor al argumento modifica realmente la variable externa pasada como argumento.



Visibilidad. Estructura de bloques:

La definición de un subprograma está formada por una cabecera o interfaz, y un bloque de código que es el cuerpo del subprograma. Ese bloque de código constituye una barrera de visibilidad que hace que los elementos declarados en el interior del cuerpo de un subprograma no sean visibles desde el exterior. Es decir, la definición de un subprograma construye un nuevo elemento, utilizable en el resto del código, y al mismo tiempo realiza una ocultación de sus detalles de realización. Los elementos definidos en el ámbito más externo son elementos globales, mientras que los elementos definidos en el interior del bloque de un subprograma son elementos locales a dicho subprograma. Cada bloque es completamente opaco desde el exterior y se puede considerar como una caja negra. La vista externa de la cabecera es realmente la interfaz del subprograma. El contenido lógico de la interfaz es lo que se denomina signatura del subprograma, que es suficiente para comprobar si las invocaciones son consistentes con su definición.



Recursividad de subprogramas:

Cuando un subprograma hace una llamada a sí mismo se dice que es un subprograma recursivo.



Problemas en el uso de subprogramas:

          Uso de variables globales. Efecto secundarios:

Una cualidad deseable es la transparencia referencial, que consiste en que el efecto de una llamada al subprograma pueda predecirse simplemente con la información contenida en el código de la llamada. Dicho de otro modo, siempre que se invoque al subprograma con los mismos valores de los argumentos se debe obtener el mismo resultado. La transparencia referencial se garantiza si el código del subprograma utiliza solamente elementos mencionados en la lista de argumentos o definidos como elementos locales. Cuando un subprograma modifica alguna variable externa, se dice que está produciendo efectos secundarios o laterales, side effects. Por tanto la transparencia referencial es deseable tanto para las funciones como para los procedimientos. Sin embargo, para las funciones es una cualidad casi imprescindible. Una función que no produzca efectos laterales y todos sus argumentos se pasen por valor se dice que es una función pura.



Redefinición de elementos:

Dentro de cada bloque se pueden definir elementos locales dándoles el nombre que se considere más adecuado en cada caso. Los nombres locales no afecta al código fuera del bloque, ya que no son visibles. Incluso es posibles repetir el mismo nombre para elementos diferentes definidos en distintos bloques.

Al dar un nombre ya utilizado como global a un nuevo elemento local del bloque se está redefiniendo dicho nombre, y automáticamente se pierda la posibilidad de acceso al elemento global del mismo nombre. Se dice que el nombre local ocultar o hace sombra, shadow al nombre global. No se debe utilizar la redefinición de elementos.



Doble referencia:

Se produce doble referencia, aliasing, cuando una misma variable se referencia con os nombres distintos, cosa que puede ocurrir en la invocación de subprogramas con argumentos pasados por referencia. Fundamentalmente esto puedo ocurrir en dos situaciones muy concretas: cuando un subprograma utiliza una variable externa que también se le pasa como argumento y cuando para utilizar un subprograma se pasa la misma variable en dos o más argumentos. No se debe utilizar la doble referencia, salvo que el subprograma se diseñe pensando en esa posibilidad. Esto último deberá quedar claro en los comentarios del subprograma.

miércoles, 23 de noviembre de 2011

Programa calcular interés

Este programa es muy útil para todos aquell@s que tengáis hipoteca ya que nos permite calcular los intereses y el saldo que debemos amortizar para pagarla en un determinado tiempo. Nosotros tenemos que ponerle el tipo de interés y la cantidad de años que quedan y ya nos calcula cuanto tenemos que ir pagando. Programa muy útil, os dejo el código fuente para que lo podáis usar y una captura de pantalla de ejemplo para que lo veáis:

#include <math.h>
#include <stdio.h>
int main(){
  float parte_capital,parte_intereses,saldo_vivo;
  float anualidad;
  float interes;
  float capital;
  int annos;

  printf("\250Capital? ");
  scanf("%f",&capital);
  printf("\250Tipo de inter\202s (%%)? "); 

  scanf("%f",&interes);
  printf("\250A\244os? ");
  scanf("%d",&annos);

  if(capital>0&&interes>0&&annos>0){

   anualidad=capital*(pow(1+interes/100.0,annos)*interes/100.0)/(pow
   (1+interes/100.0,annos)-1.0);   
    printf("Anualidad: %10.02f\n",anualidad);
    printf("A\244o   Intereses   Amortizaci\242n   Saldo vivo\n");
    printf("-------------------------------------------\n");

    for(int i=1;i<=annos;i++){
      parte_intereses=saldo_vivo*interes/100;
      parte_capital=anualidad-parte_intereses;
      saldo_vivo=saldo_vivo-parte_capital;
      printf("%6d%12.02f%15.02f%10.02f\n",i,parte_intereses,parte_capital,saldo_vivo);
    }
  }
}
 
interes de hipoteca con programa
Calcular Hipoteca

Programa que lee longitud de tres lados de un triángulo

Con este programa podemos leer la longitud de los lados de un triángulo y analizarlos para saber que tipo de triángulo es, os dejo el código fuente y una captura de pantalla para que lo podáis ver en funcionamiento:


#include <stdio.h>
int main(){
  int primer_lado,segundo_lado,tercer_lado;
  int auxiliar;

  printf("\250Primer lado? ");
  scanf("%d",&primer_lado);
  printf("\250Segundo lado? ");
  scanf("%d",&segundo_lado);
  printf("\250Tercer lado? ");
  scanf("%d",&tercer_lado);

  if(primer_lado>0&&segundo_lado>0&&tercer_lado>0){

    if(primer_lado>segundo_lado){
      auxiliar=segundo_lado;
      segundo_lado=primer_lado;
      primer_lado=auxiliar;
    }
    if(primer_lado>tercer_lado){
      auxiliar=tercer_lado;
      tercer_lado=segundo_lado;
      segundo_lado=primer_lado;
      primer_lado=auxiliar;
    }
    else if(segundo_lado>tercer_lado){
      auxiliar=tercer_lado;
      tercer_lado=segundo_lado;
      segundo_lado=auxiliar;
    }

    if(primer_lado+segundo_lado<tercer_lado){
      printf("Los lados no forman tri\240ngulo\n");
    }
    else if(primer_lado==segundo_lado&&segundo_lado==tercer_lado){
      printf("Los lados forman un tri\240ngulo equil\240tero\n");
    }
    else{
      if(primer_lado==segundo_lado||segundo_lado==tercer_lado){
        printf("Los lados forman un tri\240ngulo is\242sceles\n");
      }
      else{
        printf("Los lados forman un tri\240ngulo escaleno\n");
      }
      if(primer_lado*primer_lado+segundo_lado*segundo_lado==tercer_lado*tercer_lado){
        printf("Adem\240s, el tri\240ngulo es rect\240ngulo\n");
      }
    }
  }
}
código de programa para comprobar que tipo de triángulo es
Programa que comprueba que tipo de triángulo es

martes, 22 de noviembre de 2011

Programa Calcular número e

Aquí tenéis un programa que calcula el número e mediante el desarrollo en serie con un error menor del introducido como dato. Tenéis el código fuente y una captura de pantalla para que podáis ver que resultado da por pantalla:


#include <stdio.h>
int main(){
  const float e_referencia=2.7182818284590452353602874713527;
  const float error_tolerado_maximo=0.1;
  float error_tolerado;
  float numero_e;
  int iteracion;
  int factorial;
  float error;


  printf("\250Error tolerado? ");
  scanf("%f",&error_tolerado);


  if(error_tolerado>=0&&error_tolerado<=error_tolerado_maximo){


    numero_e=1;
    error=e_referencia-numero_e;
    iteracion=1;


    while(error>error_tolerado){


      factorial=1;
      for(int i=2;i<=iteracion;i++){
        factorial=factorial*i;
      }


      numero_e=numero_e+1/float(factorial);


      error=e_referencia-numero_e;


      iteracion++;
    }


    printf("Valor de e calculado: %10.8f tras %d iteraciones\n",numero_e,iteracion);
  }


}

calcular número e
Programa que calcula el número e

lunes, 21 de noviembre de 2011

Programa Construir Rombo de Asteriscos

Este es un programa para construir un rombo de asteriscos, dándole un número nos crea un rombo de asteriscos de ese tamaño. Os dejo el código fuente completo y una captura de pantalla para que veáis cómo se hace y el resultado final:


#include <stdio.h>
int main(){
  const int lado_maximo=50;
  const int lado_minimo=1;

  int lado;
 
  printf("\250Lado? ");
  scanf("%d",&lado);

 
  if(lado>=lado_minimo&&lado<=lado_maximo){

   
    for(int i=1;i<=lado;i++){

     
      for(int j=0;j<lado-i;j++){
        printf(" ");
      }

     
      for(int j=0;j<i;j++){

        printf("*");
        if(j+1<i){
          printf(" ");
        }
      }

     
      printf("\n");

    }
   
    for(int i=lado-1;i>=1;i--){

     
      for(int j=0;j<lado-i;j++){
        printf(" ");
      }

     
      for(int j=0;j<i;j++){

        printf("*");
        if(j+1<i){
          printf(" ");
        }
      }

    
      printf("\n");

    }
  }


}


programa rombo asteriscos
Captura de pantalla de programa que crea un rombo de asteriscos

Máximo común divisor de 2 números

Con este programa podemos calcular el MCD de 2 números, el programa nos pide 2 números y nos calcula el máximo común divisor de ellos, su estructura es muy sencilla y con el código fuente podéis entender muy bien cómo lo hace:

#include <stdio.h>
int main(){
  int primer_numero,segundo_numero;
  int auxiliar,dividendo,divisor;
  int maximo_comun_divisor;

  printf("\250Primer n\243mero? ");
  scanf("%d",&primer_numero);
  printf("\250Segundo n\243mero? ");
  scanf("%d",&segundo_numero);


  if(primer_numero>=segundo_numero){
    dividendo=primer_numero;
    divisor=segundo_numero;

  }
  else{
    dividendo=segundo_numero;
    divisor=primer_numero;

  }

  while(dividendo%divisor!=0){

    auxiliar=divisor;
    divisor=dividendo%divisor;
    dividendo=auxiliar;

  }

  maximo_comun_divisor=divisor;

  printf("El m\240ximo com\243n divisor de %d y %d es %d\n",primer_numero,segundo_numero,maximo_comun_divisor);

}

Programa para calcular el máximo común divisor de 2 números
Programa para calcular el Máximo Común Divisor

domingo, 20 de noviembre de 2011

Tabla de Multiplicar en C+-

Hola, aquí os traigo el código completo de una tabla de multiplicar en C+-, es muy fácil de implementar y consiste en un programa que nos pide un número y que en base a el nos crea su tabla de multiplicar.


#include <stdio.h>

int main(){
 
     int numero;

     printf("\250N\243mero? ");
     scanf("%d",&numero);

     printf("Tabla de multiplicar por %d\n",numero);
     printf("---------------------------\n");
 
     for(int i=1;i<=10;i++){
         printf("%6d x %2d = %7d\n",numero,i,numero*i);
      }

 }



Una captura de pantalla del resultado final:

programar tabla de multiplicar en C
Tabla de multiplicar en C + -

sábado, 19 de noviembre de 2011

Desarrollo de programas 2/3

Seguimos con más normas básicas que tenemos que es importante utilizar y tener en cuenta a la hora de desarrollar nuestros programas (Desarrollo de programas 1/3):

Desarrollo con esquemas de selección e iteración:

Esquema de selección:      Un esquema de selección consiste en plantear una acción compuesta como la realización de una acción entre varias posibles, dependiendo de ciertas condiciones.


Esquema de iteración:       Una iteración o bucle consiste en la repetición de una acción o grupo de acciones hasta conseguir el resultado deseado.


Verificación de programas:


Uno de los objetivos de la programación es la corrección. Un programa es correcto si produce siempre resultados de acuerdo con la especificación del programa. En la práctica, la verificación de un programa se hace muchas veces mediante ensayos. Un ensayo, (testing) consiste en ejecutar el programa con unos datos preparados de antemano y para los cuales se sabe cuál ha de ser el resultado a obtener. Este proceso se llama depuración (debugging).
 
          Corrección parcial y total:

          Corrección parcial: si el programa termina el resultado es correcto.
Corrección total: lo anterior y además para todo dato de entrada válido el programa termina.


Eficiencia de programas. Complejidad:

          Medidas de eficiencia:
          La eficiencia de un programa se define en función de la cantidad de recursos
          que consume durante su ejecución.
          Las principales medidas de recursos empleados son:

                    El tiempo que tarda en ejecutarse un programa.

                    La cantidad de memoria usada para almacenar datos.


          Análisis de programas:

La determinación de la eficiencia (o complejidad) de un programa se hace analizando los siguientes elementos:

Cuánto tarda en ejecutarse cada instrucción básica del lenguaje utilizado.

Cuántas instrucciones de cada clase se realizan durante una ejecución del programa.


          Crecimiento asintótico:

En los análisis de eficiencia (o complejidad) se considera muy importante la manera como la función de complejidad va aumentando con el tamño del problema. Lo que interesa es la forma de crecimiento del tiempo de ejecución, y no tanto el tiempo particular empleado. La complejidad constante sería la ideal y la complejidad exponencial resultaría muy poco eficiente.

jueves, 17 de noviembre de 2011

Estructuras básicas de la programación imperativa

Estas son las estructuras básicas que podemos encontrar en el lenguaje de programación C+-:

Programación estructurada:

La programación estructurada es una metodología de programación que trata de construir programas que sean fácilmente comprensibles.



La estructura de los programas imperativos se representa mediante diagramas de flujo llamados en inglés flow-chart.



Secuencia:

La estructura más sencilla para emplear en la descomposición es utilizar una secuencia de acciones o partes que se ejecutan de forma sucesiva.



Selección:

La estructura de selección consiste en ejecutar una acción u otra, dependiendo de una determinada condición que se analiza a la entrada de la estructura.



Iteración:

La iteración es la repetición de una acción mientras se cumpla una condición.



Estructuras anidadas:

Cualquier parte o acción puede estar constituida por cualquiera de las estructuras descritas, por tanto el anidamiento puede ser tan complejo como sea necesario.



Expresiones condicionales (operador en C+-):

          Mayor que                        >

          Mayor o igual que             >=

          Menor que                        <

          Menor o igual que             <=

          Igual a                              ==

          Diferente                           !=

          Conjunción                       &&

          Disyunción                        ||

          Negación                          !



Estructuras básicas en C+-:



          Secuencia:

                    Se escriben las acciones una tras otra.

                    Ejemplo:

                              printf(“hola:\n”);

                              printf(“estoy aquí”);



          Sentencia if, estructura de selección:

          if(condición) {

                    Acción A

          }else{

                    Acción B

          }

          Ejemplo:

          if(edad >= 18) {

                    printf(“es mayor de edad”);

          }





Sentencia while:

while (condición) {

          Acción

}

Ejemplo:

while(publico==aforo){

          printf(“no hay entradas disponibles”);

}





Sentencia for:

for (int índice = inicial; índice <=final; índice ++) {

          Acción

}

Ejemplo:

for (int j=1;j<=numeroBlancos;j++) {

printf(" ");

}

miércoles, 16 de noviembre de 2011

Desarrollo de Programas 1/3

Con esta publicación vamos a ver la parte 1/3 sobre metodología para desarrollar programas, es una metodología y reglas básicas sobre que tenemos que hacer a la hora de desarrollar nuestros proyectos:

La programación como resolución de problemas:
Resolver un problema consiste esencialmente en encontrar una estrategia a seguir para conseguir la solución.

Descomposición en subproblemas:
En problemas complejos es mejor hacer una descomposición en partes más sencillas, que a su vez pueden ser descompuestas en otras partes y así sucesivamente, hasta que seamos capaces de resolver cada una de esas partes por separado para finalmente unirlas y resolver el problema completo.

Desarrollo por refinamientos sucesivos:
Consiste en expresar inicialmente el programa a desarrollar como una acción global, que si es necesario se irá descomponiendo en acciones más sencillas hasta llegar a acciones simples que puedan ser expresadas directamente como sentencias del lenguaje de programación.

Desarrollo de un esquema secuencial:
Para desarrollar una acción compuesta según un esquema secuencial se necesita:
          Identificar las acciones componentes de la secuencia
          Identificar el orden en que deben ejecutarse las acciones componentes

Aspectos de estilo:
Una buena metodología de desarrollo de programas debe estar basada también en un buen estilo que será el que nos indique el manual de estilo, prestando especial atención al encolumnado, a los comentarios, la elección de nombres, al uso de letras mayúsculas y minúsculas, a las constantes con nombre, etc. Generalmente cuando estudiemos alguna asignatura de programación, tengamos un trabajo de programación, etc, siempre tendremos un manual de estilo que será el que nos indique cómo debemos hacerlo.

lunes, 14 de noviembre de 2011

Constantes y Variables en C+-

Seguimos profundizando en el lenguaje de programación C+- y en esta ocasión traemos un resumen de lo que son constantes, variables, sentencias de asignación, sentencias de autoincremente o autodecremente y cómo realizar operaciones de lectura simple.

Constantes:
          Una constante es un valor fijo que se utiliza en un programa.
          Declaración:
                    const float Pi = 3.14;
                    const int largo = 3;
                    const char dospuntos = ‘:’;

Variables:
         Una variable es un valor que puede ser cambiado a lo largo de la
         ejecución del programa.
          Declaración:
                    int edad;
          Para poder usar esta variable primeramente habrá que inicializarla dándole
          algún valor:
                    edad = 28;

Sentencia de asignación:
          Es una forma de conseguir que una variable guarde un valor.
          El signo igual (=) es el operador de asignación.
          Ejemplo:
                    edad = 28;     esta sentencia de asignación, asigna el valor 28 a la
                    variable edad

Sentencias de autoincremente y autodecremento:
          Como su nombre indica sirven para incrementar en 1 o en decrementar en 1
          el valor de alguna variable.
          Ejemplo:
          variable++;
          variable--;

Operaciones de lectura simple.
          El procedimiento scanf. Pertenece al módulo de la librería stdio.
          Sirve para almacenar un dato en una variable, se usa de la siguiente forma:
          scanf ( valor, &variable);
          valor sería el dato a leer y variable sería la variable donde va ser almacenado.
          Por ejemplo cuando queremos leer dos datos de números reales sería
          así: scanf ( “%f%f”, &dato1, &dato2); al usar %f estamos indicando que
          el dato es una float, por lo tanto la variable dato1 también debe ser float,
          es decir, el dato que introducimos debe ser del mismo tipo que la variable
          donde se va a almacenar

sábado, 12 de noviembre de 2011

Elementos básicos programación C+-

Hola, aquí os dejo un resumen de los elementos básicos de programación en lenguaje C+-

Caracteres de control:

          \n       Salto al comienzo de una nueva línea de escritura
          \r        Retornos al comienzo de la misma línea de escritura
          \t        Tabulación
          \’’        Apóstrofo
          \\        Barra inclinada
          \f        Salto a una nueva página o borrado de pantalla
          “hola”            Cadena de caracteres (string)

Tipos predefinidos:

          Int                Valores enteros
                    Operaciones predefinidas:
                              +        Suma de enteros                         a+b
                              -         Resta de enteros                         a-b

                              *         Multiplicación de enteros             a*b
                              /         División de enteros                      a/b
                              %       Resto de la división                     a%b
                              +        Identidad de un entero                 +a
                              -         Cambio de signo de un entero     -a

          Float             Valores reales
                    Operaciones predefinidas:
                              +        Suma de reales                           a+b
                              -         Resta de reales                           a-b
                              *         Multiplicación de reales               a*b
                              /         División de reales                        a/b
                              +        Identidad de un entero                 +a
                              -         Cambio de signo de un entero     -a

          Char             Carácter
                    Funciones de la librería ctype (<ctype.h>)
                              isalpha(c)     Indica si c es una letra
                              isascii(c)       Indica si c es un carácter ASCII
                              isblank(c)     Indica si c es un carácter de espacio o tabulación
                              iscntrl(c)       Indica si c es un carácter de control
                              isdigit(c)        Indica si c es un dígito decimal (0-9)
                              islower(c)      Indica si c es una letra minúscula
                              isspace(c)     Indica si c es espacio en blanco o salto de línea de página
                              isupper(c)     Indica si c es una letra mayúscula
                              tolower(c)     Devuelve la minúscula correspondiente a c
                              toupper(c)     Devuelve la mayúscula correspondiente a c

Operaciones de escritura:
                    Procedimiento printf, pertenece al módulo stdio (<stdio.h>)
                              printf(cadena de caracteres);
                              Ejemplo:
                                         printf(“hola a todos”);


Estructura de un programa completo:
          #include <stdio.h>
          Int main() {
               printf(“hola a todos”);
          }


Comentarios:
          Los comentarios se incluyen dentro de los símbolos /* y */
          Ejemplo: /* Comentario */