miércoles, 30 de noviembre de 2011



Lenguaje C



C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación Ccon mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.
Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.
Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT.
Una particularidad del C++ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crear nuevos tipos que se comporten como tipos fundamentales.
El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.

C++
C plus plus.svg
Desarrollador(es)
Bjarne Stroustrup, Bell Labs
Información general
Extensiones comunes.h .hh .hpp .hxx .h++ .cc .cpp .cxx .c++
Paradigmamultiparadigma:orientado a objetos,imperativoprogramación genérica.
Apareció en1983
Diseñado porBjarne Stroustrup
Última versión estableISO/IEC 14882:2011(2011)
Última versión en pruebasC++11
Tipo de datofuerte, estático, inseguro, nominativo
ImplementacionesC++ Builderclang,Comeau C/C++GCC,Intel C++ Compiler,Microsoft Visual C++Sun Studio
DialectosISO/IEC C++ 1998,ISO/IEC C++ 2003,ISO/IEC C++ 2011
Influido porCSimulaAda 83,ALGOL 68CLUML1
Ha influido aPerlLPCLuaPikeAda 95JavaPHPDC99,C#Falcon
Sistema operativoMultiplataforma


es un lenguaje de programación de propósito general asociado, de modo universal, al sistema operativo UNIX. Sin embargo, la popularidad, eficacia y potencia de C se ha producido porque este lenguaje no está prácticamente asociado a ningún sistema operativo, ni a ninguna máquina en especial.

Esta es la razón fundamental por la que C es conocido como el lenguaje de programación de sistemas por excelencia.

ejercicio de funcion scanf


// Este ejemplo guarda un número en n.
 
int n;
printf("Introduce un numero: ");
scanf("%d",&n);
 
// Este ejemplo guarda un caracter en m.
 
char m;
printf("Introduce un caracter: ");
scanf("%c",&m);
 
// Este ejemplo guarda una cadena de caracteres (solamente una palabra) en cad. 
// Notese la ausencia de &
 
char cad[20];
printf("Introduce una palabra: ");
scanf("%s",cad);
 
printf("Introduce una palabra: ");
scanf("%10s",cad);  // lee máximo 10 caracteres y le concatena el carácter cero.

ejercicio de funcion printf


El siguiente programa utiliza la función printf( ) para imprimir distintos tipos de variables. Como recordarás, cada tipo de variable precisa de su carácter de conversión precedido del carácter %, pudiendo haber entre ambos caracteres uno o varios elementos para el alineamiento por la izquierda, la anchura mínima del campo, etc. Y como una ejecución vale más que mil palabras, aquí tienes el programa para que lo puedas probar. Guárdalo con el nombre formatos.c.

Soluciones

Solución comentada al Ejercicio:
/* fichero formatos.c */
#include <stdio.h>
int main(void) {
  int x=45;
  double y=23.354;
  char z[]="Esto es vida";

  /* utilizamos barras inclinadas (/) para ver claramente la anchura del campo de caracteres */
  printf("Voy a escribir /45/ utilizando el formato %%d: /%d/\n", x);
  printf("Voy a escribir /45/ utilizando el formato %%1d: /%1d/\n", x);
  printf("Voy a escribir /45/ utilizando el formato %%10d: /%10d/\n\n", x);
  printf("Voy a escribir /23.354/ utilizando el formato %%f:/%f/\n", y);
  printf("Voy a escribir /23.354/ utilizando el formato %%.3f: /%.3f/\n", y);
  printf("Voy a escribir /23.354/ utilizando el formato %%5.1f: /%5.1f/\n", y);
  printf("Voy a escribir /23.354/ utilizando el formato %%-10.3f:/%-10.3f/\n", y);
  printf("Voy a escribir /23.354/ utilizando el formato %%5f: /%5f/\n\n", y);
  printf("Voy a escribir /Esto es vida/ utilizando el formato %%s: /%s/\n", z);
  printf("Voy a escribir /Esto es vida/ utilizando el formato %%.7s:/%.7s/\n", z);
  printf("Voy a escribir /Esto es vida/ utilizando el formato %%-15.10s: /%-15.10s/\n", z);
  printf("Voy a escribir /Esto es vida/ utilizando el formato %%15s: /%15s/\n", z);
}

ejercicio de funcion Gotoxy

//Funcion: gotoxy()
//Sintaxis:
//void gotoxy(int x, int y);
//Descripcion: Mueve el cursor de la ventana de texto a la posicion segun las coordenadas
//especificadas por los argumentos x e y. Si las coordenadas no son validas entonces
//la llamda a la funcion gotoxy es ignorada. Los argumentos no pueden ser 0.
//Ejemplo:
#include <conio.h>
void main() {
   clrscr();
   cprintf( "Ejemplo de \"gotoxy\"\n\n" );
   cprintf( "1ø linea    " );
   cprintf( "2ø linea" );
   gotoxy( 5, 20 ); //me posiciono en "renglon" 20
   cprintf( "3ø linea, pero sale £ltima" );
   gotoxy( 20, 2 ); //me posiciono en el "renglon" 2
   cprintf( "4ø linea, pero sale segunda" );
   gotoxy( 1, 15 );  //me posiciono en el "rengon" 15
   cprintf( "Pulsa una tecla para continuar...\r\n" );
   getch();
}

ejercicio de función getche


Te proponemos este programa que imprime los 21 primeros números y sus repectivos cuadrados de tres formas distintas. Para ejecutar de forma pausada el programa hemos introducido la función getchar( ) que espera que pulses cualquier tecla para capturar el carácter correspondiente (en este caso no se hace nada con dicho carácter, que está disponible como valor de retorno; es un simple truco para que el ordenador espere hasta que pulsemos una tecla cualquiera) y continuar ejecutando el programa. Guarda el programa como cuadrados.c.
Solución comentada al Ejercicio:
/* fichero cuadrados.c */
# include <stdio.h>
void main(void) {
  int num=1; 
  while (num<21) {
     printf("%10d %10d\n", num, num*num);
     num=num+1;
  }
  getchar();
  num=1;
  while (num<21) {
     printf("%10d %10d\n", num, num*num);
     num+=1;
  }
  getchar();
  num=1;
  while (num<21) {
     printf("%10d %10d\n", num, num*num);
     num++;
  }
}
En este programa las instrucciones: num=num+1, num+=1 y num++, las podrás utilizar de la forma que más te convenga, es decir, que la mayor o menor utilidad de una sobre otra se dará en la medida que quieras simplificar tus programas que realizarás más adelante. Como ya hemos dicho, la macro getchar() espera a que el usario teclee un valor cualquiera para continuar ejecutando el programa. Es una forma de esperar una señal del usario para continuar con la solución del programa. Se puede observar que si se pulza un carácter cualquiera seguido de un Intro, en realidad se han pulsado dos caracteres y el programa tiene suficiente para llegar hasta el final. Si se pulsa sólo el Intro hay que pulsarlo dos veces.

Solucion en Pseudocódigo

ALGORITMO cuadrados
ENTRADAS:
   (No tiene entradas)
SALIDAS:
   (El cuadrado de los 21 primeros números)
VARIABLES:
   num: ENTERO
INICIO
           
   num<--1
   MIENTRAS num<21 HACER
     ESCRIBIR  num, num*num
     ESCRIBIR SaltoDeLinea
     num<--num+1
   FIN_MIENTRAS
                 
   num<--1
   REPETIR    
     ESCRIBIR  num, num*num
     ESCRIBIR SaltoDeLinea
     num<--num+1
   HASTA num>=21
                 
   PARA num<--1 HASTA 20 HACER
     ESCRIBIR  num, num*num
     ESCRIBIR SaltoDeLinea
     num<--num+1
   FIN_PARA
                 
FIN

sentencias


Una sentencia es cualquier expresión en C que se espera que tenga alguna consecuencia. Pueden ser asignaciones, operaciones, llamadas a funciones o combinaciones de ellas.
Toda sentencia termina con un ";". Una sentencia simple consiste en una expresión acabada en un punto y coma (;).
7.1 Etiquetas de sentencia
Sirven para etiquetar una sentencia de forma que el control del programa pueda ser transferido a ella. Se separan de la sentencia por dos puntos ":".

La sintaxis es:etiqueta: sentencia;
 


Por ejemplo, etiq100: x++;.7.2 Sentencias compuestas
Es un conjunto de sentencia simples que se encierran entre los símbolos "{" y "}" para formar un bloque de código. Pueden aparecer en cualquier sitio en el que podría aparecer una sentencia simple. Pueden contener declaraciones de nuevos objetos (el alcance de la declaración afecta al bloque).

La sintaxis es:{
sentencia;
sentencia;
¿.
sentencia;
}

Sentencias de selección 

Existen dos tipos, if y switch. Además, el operador "?" es una alternativa para if en ciertas situaciones. if y switch. Además, el operador "?" es una alternativa para if en ciertas situaciones.
 

IF
La forma general es:

if
(expresion) sentencia;
else sentencia;

Donde sentencia puede ser una sentencia simple, un bloque de sentencias o nada (en el caso de sentencias vacías). La cláusula else es opcional. Si la expresión del if es cierta (cualquier valor que no sea 0), se ejecuta la sentencia o el bloque de sentencias que constituye el objetivo del if; en cualquier otro caso se ejecuta la sentencia o bloque de sentencias que constituye el objetivo del else, si existe. Siempre se ejecuta el código asociado al if o al else, nunca ambos.
Un if anidado es un if que es el objeto de otro if o else. Son muy comunes en la programación. Un sentencia else siempre se refiere al if más próximo que esté en el mismo bloque que el else y que no esté asociado con un if. Por ejemplo: else es opcional. Si la expresión del if es cierta (cualquier valor que no sea 0), se ejecuta la sentencia o el bloque de sentencias que constituye el objetivo del if; en cualquier otro caso se ejecuta la sentencia o bloque de sentencias que constituye el objetivo del else, si existe. Siempre se ejecuta el código asociado al if o al else, nunca ambos.
if(i) {
if(j) sentencia 1;
if(k) sentencia 2; /* este if esta */
else sentencia 3; /* asociado con este else */
}
El estándar ANSI específica que al menos se deben permitir 15 niveles de anidamiento. En la práctica, la mayoría de los compiladores permiten bastantes más. La alternativa ?

SWITCH 
Es una sentencia de selección múltiple, que compara sucesivamente el valor de una expresión con una lista de constantes enteras o de caracteres. Cuando se encuentra una16-correspondencia, se ejecutan las sentencias asociadas con la constante. La forma general es:
-correspondencia, se ejecutan las sentencias asociadas con la constante. La forma general es:

switch (expresión) {
case constante1:
secuencia de sentencias;
break;
¿..
¿..
default:
secuencia de sentencias;
}

Se comprueba el valor de la expresión, por orden, con los valores de las constantes especificadas en las sentencias case. Cuando se encuentra una correspondencia, se ejecuta la secuencia de sentencias asociada con ese case, hasta que se encuentra la sentencia break o el final de la sentencia switch. Si no se incluye la sentencia break, sigue buscando más correspondencias en las siguientes sentencias case. La sentencia sentencia break o el final de la sentencia switch. Si no se incluye la sentencia break, El estándar ANSI específica que una sentencia switch debe permitir al menos 257 sentencias case. En la práctica el número empleado es menor por razones de eficiencia.
Aunque case es una sentencia de etiqueta, no tiene calidad por sí misma fuera de un case. En la práctica el número empleado es menor por razones de eficiencia.
Aunque case es una sentencia de etiqueta, no tiene calidad por sí misma fuera de un case es una sentencia de etiqueta, no tiene calidad por sí misma fuera de un switch.
La sentencia switch se diferencia de la sentencia if en que sólo puede comparar la igualdad, mientras que if puede evaluar expresiones relacionales o lógicas.
No puede haber dos constantes case en el mismo switch que tengan los mismos valores (por supuesto que una sentencia switch contenida en otra sentencia switch pude tener constantes case que sean iguales).
Si se utilizan constantes de tipo carácter en la sentencia switch, se convierten automáticamente a sus valores enteros.

 Sentencias de iteración 

También denominadas bucles. Permiten realizar un conjunto de instrucciones hasta que se alcance una cierta condición (que puede estar predefinida como en el bucle for; o no haber final predeterminado, como en los bucles while y do-while).
 FOR

El formato general es:for (inicialización; condición; incremento) sentencia; La inicialización normalmente es una sentencia de asignación que se utiliza para iniciar la variable de control del bucle.
La condición es una expresión relacional que determina cuando finaliza el bucle. El incremento define como cambia la variable de control cada vez que se repite el bucle.
Estas tres secciones principales deben ser separadas por punto y coma (";"). El bulce for continua ejecutándose mientras que la condición sea cierta. Una vez que la condición es falsa, la ejecución del programa sigue por la sentencia siguiente al for.

No es obligatoria ninguna de las tres expresiones, por ejemplo, se puede realizar un bucle infinito de la forma:

FOR

Sentencias de salto 

C tiene cuatro sentencias que llevan a cabo un salto incondicional (además de goto, pero su uso no está bien visto por sus programadores): return, break, exit() y continue. goto, pero su uso no está bien visto por sus programadores): return, break, exit() y continue.
 

RETURN 

Se usa para volver de una función. Se trata de una sentencia de salto porque hace que la ejecución vuelva al punto en que se hizo la llamada a la función. Si hay algún valor asociado con return, se trata del valor de vuelta de la función. Si no se especifica un valor de vuelta, se asume que devuelve un valor sin sentido.
 
Donde expresión es opcional. Se pueden usar tantas sentencias return como se quiera en una función. Sin embargo, la función termina al encontrar el primero.
expresión es opcional. Se pueden usar tantas sentencias return como se quiera en una función. Sin embargo, la función termina al encontrar el primero.

BREAK 

Tiene dos usos: para finalizar un case en una sentencia switch y para forzar la terminación inmediata de un bucle, saltando la evaluación condicional normal del ciclo.
Cuando se encuentra la sentencia break dentro de un bucle, el bucle finaliza inmediatamente y el control sigue en la sentencia posterior al bucle.

EXIT() 

Igual que se puede interrumpir un bucle, se puede salir anticipadamente de un programa usando la función exit() de la biblioteca estándar. Esta función da lugar a la terminación inmediata del programa, forzando la vuelta al sistema operativo. La forma general de la
 
función exit() es:

void exit (int código_de_vuelta);

El valor de código_de_vuelta es el que se devuelve al proceso de llamada, que normalmente es el sistema operativo. Generalmente se usa un cero como código de vuelta para indicar que se trata de una terminación normal del programa. Se utiliza otros argumentos para indicar algún tipo de error.

CONTINUE 

Funciona de forma similar a break. Sin embargo, en vez de forzar la terminación, break. Sin embargo, en vez de forzar la terminación, continue fuerza una nueva iteración del bucle y salta cualquier código que exista entremedias. Para el bucle for, continue hace que se ejecuten las partes de prueba condicional y de incremento del bucle. Para los bucles while y do-while, el control del programa pasa a la prueba condicional.


estructura de control.


Las estructuras de control permiten controlar el flujo de ejecución de las instrucciones en un código. Con estas estructuras, el programador puede determinar el orden y las veces que se ejecutarán las instrucciones que están dentro de estas estructuras.

Originalmente las líneas de código (las instrucciones) eran ejecutadas siempre secuencialmente, o sea, una después de la otra. Se utilizaba la función
 GOTO para alterar el orden de ejecución. Con esta función se podía ir de un lado para el otro en el código. Esta función traía grandes problemas en el desarrollo de programas, como falta de claridad, errores, etc., por lo que se enunciaron tres estructuras de control que permitirían desarrollar cualquier programa: estructura de secuencia, estructuras de selección y estructuras de repetición.
La estructura de secuencia es la que venimos trabajando desde el principio. Es la ejecución de una instrucción tras otra en secuencia.

Las estructuras de selección son aquellas que permiten, bajo una condición, ejecutar distintos códigos. La más simple es la estructura de selección IF. Se da una condición que puede ser verdadera o falsa, y se ejecuta un código u otro dependiendo del resultado de esa condición en tiempo de ejecución. También está la estructura de selección SWITCH que, dependiendo de un valor, ejecutará distintos códigos.

Luego están las estructuras de repetición, las cuales repiten un código cierta cantidad de veces hasta que se cumpla o deje de cumplir una condición. Son ejemplos de estas estructuras en C los WHILE, los FOR, etc.

estructuras de control


C ++


for


La forma general de esta sentencia es:

for (expresion 1; expresion 2; expresion 3)
        sentencia;


Figura 3.4: Sentencia for
\includegraphics[width=55mm]{im/sintaxis/for.eps}


  • Inicialmente se ejecuta expresion 1, se hace para inicializar algún parámetro que controla la repetición del bucle.
  • expresion 2 es una condición que debe ser cierta para que se ejecute sentencia.
  • expresion 3 se utiliza para modificar el valor del parámetro.
  • El bucle se repite mientras expresion 2 sea cierto.
  • Si sentencia es compuesta se encierra entre { }.
  • Si se omite expresion 2 se asumirá el valor permanente de 1 y el bucle se ejecutará de forma indefinida (bucle infinito).

Un ejemplo de uso de esta sentencia es el siguiente fragmento de programa, que calcula la suma de los numeros del 1 al 100:

int numero, suma;

suma=0;
for (numero=1; numero<=100; numero++)
    suma = suma + numero;

while

sintaxis

 
while ( <expresión_lógica> )
   {
      
<bloque_de_instrucciones>
   }
 

Cuando el <bloque_de_instrucciones> sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar llave (}) son opcionales.

Por otra parte, al igual que en las instrucciones alternativas doble y simple, a la<expresión_lógica> de una instrucción repetitiva while, también se le llama condición.

Para que se ejecute el <bloque_de_instrucciones>, la condición tiene que ser verdadera. Por el contrario, si la condición es falsa, el<bloque_de_instrucciones> no se ejecuta.

Por tanto, cuando el flujo de un programa llega a un bucle while, existen dos posibilidades:

  1. Si la condición se evalúa a falsa, el bloque de instrucciones no se ejecuta, y el bucle while finaliza sin realizar ninguna iteración.
  2. Si la condición se evalúa a verdadera, el bloque de instrucciones sí que se ejecuta y, después, se vuelve a evaluar la condición, para decidir, de nuevo, si el bloque de instrucciones se vuelve a ejecutar o no. Y así sucesivamente, hasta que, la condición sea falsa.
El <bloque_de_instrucciones> de un bucle while puede ejecutarse cero o más veces (iteraciones). Si el <bloque_de_instrucciones> se ejecuta al menos una vez, seguirá ejecutándose repetidamente, mientras que, la condición sea verdadera. Pero, hay que tener cuidado de que el bucle no sea infinito.

Cuando la condición de un bucle while se evalúa siempre a verdadera, se dice que se ha producido un bucle infinito, ya que, el programa nunca termina. Un bucle infinito es un error lógico.

Es importante hacer hincapié en el hecho de que, en un bucle while, primero se evalúa la condición y, en el caso de que ésta sea verdadera, entonces se ejecuta el bloque de instrucciones. Veremos que, en el bucle do...while, el procedimiento es al revés. En él, primero se ejecuta el bloque de instrucciones y, después, se evalúa la condición.

Para que un bucle while no sea infinito, en el bloque de instrucciones debe ocurrir algo para que la condición deje de ser verdadera. En la mayoría de los casos, la condición se hace falsa al cambiar el valor de una variable.

En resumen, una instrucción repetitiva while permite ejecutar, repetidamente, (cero o más veces) un bloque de instrucciones, mientras que, una determinada condición sea verdadera.



Ejemplo 1: Se quiere escribir un programa que muestre por pantalla los primeros diez números naturales:


   1 2 3 4 5 6 7 8 9 10

 

En lenguaje C, para resolver el problema de este ejemplo se puede escribir:
#include <stdio.h>

int main()
{
   int contador;

   printf( "\n   " );

   contador = 1/* Inicialización del contador */
   while ( contador <= 10 )        /* Condición */
   {
      printf( "%d ", contador );   /* Salida */
      contador++;    /* Incremento del contador */
   }

   return 0;
}

do while



sintaxis:

 do
   {
      
<bloque_de_instrucciones>
   } while ( 
<expresión_lógica> );


Cuando el <bloque_de_instrucciones> sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar llave (}) son opcionales.Además, como se puede apreciar, la instrucción repetitiva do...while, también hace uso de una condición.

En un bucle do...while, primero se ejecuta el bloque de instrucciones y, después, se evalúa la condición. En el caso de que ésta sea verdadera, se vuelve a ejecutar el bloque de instrucciones. Y así sucesivamente, hasta que, la condición sea falsa.

Por consiguiente, cuando el flujo de un programa llega a un bucle do...while, existen dos posibilidades:

  1. Se ejecuta el bloque de instrucciones y, después, si la condición se evalúa a falsa, el bloque de instrucciones no se vuelve a ejecutar, de manera que, el bucle do...while finaliza, habiendo realizado una solaiteración.
  2. Se ejecuta el bloque de instrucciones y, a continuación, si la condición se evalúa a verdadera, el bloque de instrucciones se vuelve a ejecutar. Y así sucesivamente, hasta que la condición sea falsa.
El <bloque_de_instrucciones> de un bucle do...while puede ejecutarse una o más veces (iteraciones). También hay que prevenir que el bucle no sea infinito.

En resumen, una instrucción repetitiva do...while permite ejecutar repetidamente (una o más veces) un bloque de instrucciones, mientras que, una determinada condición sea verdadera.



Ejemplo 1: De modo que, utilizando un bucle do...while, el problema del ejemplo 1 del apartado anterior, 3.1 Repetitiva mientras, se puede resolver con el código:



#include <stdio.h>

int main()
{
   int contador;

   printf( "\n   " );

   contador = 1/* Inicialización del contador */
   do
   {
      printf( "%d ", contador );   /* Salida */
      contador++;                 /* Incremento */
   } while ( contador <= 10 );     /* Condición */

   return 0;
}