Sunteți pe pagina 1din 49

Repblica bolivariana de Venezuela. Ministerio del Poder Popular para la Educacin Universitaria.

Instituto Universitario de Tecnologa Cuman Extensin Punta de Mata. Programa Nacional de Formacin Ing. Instrumentacin y Control. Punta de Mata. edo Monagas. Trayecto 2.

Profesor:

Br: Bistochet Carlos C.I:17.405.859. Santil Jos C.I:20.404.139. Sanvicente Paola C.I:20.563.262. Rondn Leomarys C.I:22.709.621. Ubac Jess C.I: 19.975.829.

Introduccin: El lenguaje c ha venido desenvolviendo un papel fundamental en la programacin ya que la mayora de los programas o aplicacin que instalamos en nuestros ordenadores son basado bajo cdigo en c, lo que hace imprescindible aprender este lenguaje de programacin para la formacin integral de los profesionales de hoy en da.

Desarrollo: C es un lenguaje de programacin creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell como evolucin del anterior lenguaje B, a su vez basado en BCPL. Al igual que B, es un lenguaje orientado a la implementacin de Sistemas Operativos, concretamente Unix. C es apreciado por la eficiencia del cdigo que produce y es el lenguaje de programacin ms popular para crear software de sistemas, aunque tambin se utiliza para crear aplicaciones. Se trata de un lenguaje dbilmente tipificado de medio nivel pero con muchas caractersticas de bajo nivel. Dispone de las estructuras tpicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar cdigo en ensamblador con cdigo C o acceder directamente a memoria o dispositivos perifricos. La primera estandarizacin del lenguaje C fue en ANSI, con el estndar X3.159-1989. El lenguaje que define este estndar fue conocido vulgarmente como ANSI C. Posteriormente, en 1990, fue ratificado como estndar ISO (ISO/IEC 9899:1990). La adopcin de este estndar es muy amplia por lo que, si los programas creados lo siguen, el cdigo es porttil entre plataformas y/o arquitecturas. Historia Desarrollo inicial El desarrollo inicial de C se llev a cabo en los Laboratorios Bell de AT&T entre 1969 y 1973; segn Ritchie, el periodo ms creativo tuvo lugar en 1972. Se le dio el nombre "C" porque muchas de sus caractersticas fueron tomadas de un lenguaje anterior llamado "B". Hay muchas leyendas acerca del origen de C y el sistema operativo con el que est ntimamente relacionado, Unix. Algunas de ellas son:
y

El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space Travel. Haban estado jugando en el mainframe de su compaa, pero debido a su poca capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenan suficiente control sobre la nave para evitar colisiones con los asteroides. Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa mquina no tena sistema operativo, as que decidieron escribir uno. Finalmente decidieron portar el sistema operativo del PDP-11 que haba en su oficina, pero era muy costoso, pues todo el cdigo estaba escrito en lenguaje ensamblador. Entonces decidieron usar un lenguaje de alto

nivel y porttil para que el sistema operativo se pudiera portar fcilmente de un ordenador a otro. Consideraron usar B, pero careca de las funcionalidades necesarias para aprovechar algunas caractersticas avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C. La justificacin para obtener el ordenador original que se us para desarrollar Unix fue crear un sistema que automatizase el archivo de patentes. La versin original de Unix se desarroll en lenguaje ensamblador. Ms tarde, el lenguaje C se desarroll para poder reescribir el sistema operativo.

En 1973, el lenguaje C se haba vuelto tan potente que la mayor parte del kernel Unix, originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. ste fue uno de los primeros ncleos de sistema operativo implementados en un lenguaje distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en PL/I, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961). El C de Kernighan y Ritchie En 1978, Ritchie y Brian Kernighan publicaron la primera edicin de El lenguaje de programacin C, tambin conocido como La biblia de C. Este libro fue durante aos la especificacin informal del lenguaje. El lenguaje descrito en este libro recibe habitualmente el nombre de "el C de Kernighan y Ritchie" o simplemente "K&R C" (La segunda edicin del libro cubre el estndar ANSI C, descrito ms abajo.) Kernighan y Ritchie introdujeron las siguientes caractersticas al lenguaje:
y y y y

El tipo de datos struct. El tipo de datos long int. El tipo de datos unsigned int. Los operadores =+ y =- fueron sustituidos por += y -= para eliminar la ambigedad sintctica de expresiones como i=-10, que se podra interpretar bien como i =- 10 o bien como i = -10.

El C de Kernighan y Ritchie es el subconjunto ms bsico del lenguaje que un compilador debe de soportar. Durante muchos aos, incluso tras la introduccin del ANSI C, fue considerado "el mnimo comn denominador" en el que los programadores deban programar cuando deseaban que sus programas fueran transportables, pues no todos los compiladores soportaban completamente ANSI, y el cdigo razonablemente bien escrito en K&R C es tambin cdigo ANSI C vlido. En estas primeras versiones de C, las nicas funciones que necesitaban ser declaradas si se usaban antes de la definicin de la funcin eran las que retornaban valores no enteros. Es decir, se presupona que una funcin que se usaba sin declaracin previa (prototipo) devolvera un entero.

Ejemplo de llamada que requiere declaracin previa (prototipo): long int cierta_funcion(); int llamando_funcion() { long int ret; ret = cierta_funcion(); } Ejemplo de llamada que no requiere declaracin previa: int llamando_funcion() { int ret; ret = alguna_otra_funcion(); } int alguna_otra_funcion() { return 0; } Dado que el lenguaje C de K&R no inclua ninguna informacin sobre los argumentos de las funciones, no se realizaba comprobacin de tipos en los parmetros de las funciones, aunque algunos compiladores lanzan mensajes de advertencia si se llamaba a una funcin con un nmero incorrecto de argumentos. A su vez, para indicar los parmetros que se utilizaban en una funcin, estos se declaraban de la siguiente manera:2 int main() { return callme(1, "c"); } int callme(i, s) int i; char *s; { /*....*/ } En los aos siguientes a la publicacin del C de Kernighan y Ritchie, se aadieron al lenguaje muchas caractersticas no oficiales, que estaba soportadas por los compiladores de AT&T, entre otros. Algunas de estas caractersticas eran:

y y y y y y

Funciones void y el tipo de datos void *. Funciones que retornaban tipos de datos struct o union (en lugar de punteros). Asignacin de tipos de datos struct. Calificador const, que hace que un objeto sea de slo lectura. Una biblioteca estndar, que incorporaba la mayora de las funcionalidades implementadas por varios desarrolladores de compiladores. Enumeraciones.

ANSI C e ISO C Artculo principal: ANSI C A finales de la dcada de 1970, C empez a sustituir a BASIC como lenguaje de programacin de microcomputadores predominante. Durante la dcada de 1980 se empez a usar en los IBM PC, lo que increment su popularidad significativamente. Al mismo tiempo, Bjarne Stroustrup empez a trabajar con algunos compaeros de Bell Labs para aadir funcionalidades de programacin orientada a objetos a C. El lenguaje que crearon, llamado C++, es hoy en da el lenguaje de programacin de aplicaciones ms comn en el sistema operativo Microsoft Windows; mientras que C sigue siendo ms popular en el entorno Unix. Otro lenguaje que se desarroll en esa poca, Objective C, tambin aadi caractersticas de programacin orientada a objetos a C. Aunque hoy en da no es tan popular como C++, se usa para desarrollar aplicaciones Cocoa para Mac OS X. En 1983, el Instituto Nacional Estadounidense de Estndares organiz un comit, X3j11, para establecer una especificacin estndar de C. Tras un proceso largo y arduo, se complet el estndar en 1989 y se ratific como el "Lenguaje de Programacin C" ANSI X3.159-1989. Esta versin del lenguaje se conoce a menudo como ANSI C, o a veces como C89 (para distinguirla de C99). En 1990, el estndar ANSI (con algunas modificaciones menores) fue adoptado por la Organizacin Internacional para la Estandarizacin (ISO) en el estndar ISO/IEC 9899:1990. Esta versin se conoce a veces como C90. No obstante, "C89" y "C90" se refieren en esencia al mismo lenguaje. Uno de los objetivos del proceso de estandarizacin del ANSI C fue producir una extensin al C de Kernighan y Ritchie, incorporando muchas funcionalidades no oficiales. Sin embargo, el comit de estandarizacin incluy tambin muchas funcionalidades nuevas, como prototipos de funcin, y un preprocesador mejorado. Tambin se cambi la sintaxis de la declaracin de parmetros para hacerla semejante a la empleada habitualmente en C++: main(argc, argv) int argc; char **argv;

{ ... } pas a ser int main(int argc, char *argv[]) { ... } ANSI C est soportado hoy en da por casi la totalidad de los compiladores. La mayora del cdigo C que se escribe actualmente est basado en ANSI C. Cualquier programa escrito slo en C estndar sin cdigo que dependa de un hardware determinado funciona correctamente en cualquier plataforma que disponga de una implementacin de C compatible. Sin embargo, muchos programas han sido escritos de forma que slo pueden compilarse en una cierta plataforma, o con un compilador concreto, esto puede ser debido a diversos motivos:
y y y

La utilizacin de bibliotecas no estndar, como interfaces grficas de usuario. El uso de compiladores que no cumplen las especificaciones del estndar. El uso de tipos de datos suponiendo que tendrn el mismo tamao u orden de los bits en todas las plataformas.

La macro __STDC__ puede usarse para dividir el cdigo en secciones ANSI y K&R para el compilador. # if __STDC__ extern int getopt(int,char * const *,const char *); # else extern int getopt(); # endif Algunos programadores recomiendan usar "#if __STDC__", como en el ejemplo, en lugar de "#ifdef __STDC__" porque algunos compiladores le asignan el valor cero a __STDC__ para indicar que no son compatibles con ANSI. C99 Tras el proceso de estandarizacin de ANSI, la especificacin del lenguaje C permaneci relativamente estable durante algn tiempo, mientras que C++ sigui evolucionando. Sin embargo, el estndar continu bajo revisin a finales de la dcada de 1990, lo que llev a la publicacin del estndar ISO 9899:1999 en 1999. Este estndar se denomina habitualmente "C99". Se adopt como estndar ANSI en marzo de 2000.

Las nuevas caractersticas de C99 incluyen:


y y

y y

y y

Funciones inline. Las variables pueden declararse en cualquier sitio (como en C++), en lugar de poder declararse slo tras otra declaracin o al comienzo de una declaracin compuesta. Muchos tipos de datos, incluyendo long long int (para reducir el engorro de la transicin de 32 bits a 64 bits), un tipo de datos booleano, y un tipo complex que representa nmeros complejos. Arrays de longitud variable. Soporte para comentarios de una lnea que empiecen con //, como en BCPL o en C++, caracterstica para la que muchos compiladores haban dado soporte por su cuenta. muchas funciones nuevas, como snprintf() muchos headers nuevos, como stdint.h.

Una consideracin importante es que hasta la publicacin de este estndar, C haba sido mayormente un subconjunto estricto del C++. Era muy sencillo "actualizar" un programa de C hacia C++ y mantener ese cdigo compilable en ambos lenguajes. Sin embargo, el nuevo estndar agrega algunas caractersticas que C++ no admite, como por ejemplo los inicializadores estticos de estructuras. Tambin define al tipo "bool" de una manera que no es exactamente la del C++. El compilador GCC, entre muchos otros, soportan hoy en da la mayora de las nuevas caractersticas de C99. Sin embargo, este nuevo estndar ha tenido poca acogida entre algunos desarrolladores de compiladores, como Microsoft y Borland, que se han centrado en C++. Brandon Bray, de Microsoft, dijo a este respecto: "En general, hemos visto poca demanda de muchas caractersticas de C99. Algunas caractersticas tienen ms demanda que otras, y consideraremos incluirlas en versiones futuras siempre que sean compatibles con C++."3

Problemas y anomalas de programacin en c. Los siguientes ejercicios deben ser resueltos en un progrma (en C/C++ ): 1. Expresiones entrefijas y prefijas. Las expresiones aritmticas pueden representarse de varias maneras, una de ellas, la ms usual es la notacin entrefija.

La notacin entrefija establece que en medio de dos operandos se escribe un operador, como por ejemplos: 1. 2. , donde los operandos son y , y el operador es el smbolo ;

Donde el parntesis ms interno establece la mayor prioridad, de manera que primero se debe evaluar , luego resultado . y fimalmente , luego , dando como

3.

No hay nada que hacer, pues es un operador unario.

En las expresiones prefijas se establece que el orden de escritura debe ser, primero el operador y luego la lista de operandos: 4. 5. , donde los operandos son y , y el operador es el smbolo ;

Lo primero que hay que hacer es tomar el primer operador y tomar los operandos necesarios siguientes (dos si se trata de un operador binario y uno si es un operador unario). En este caso se trata de evaluar . Cada uno de los operandos debe ser tratado de nuevo como una expresion en prefijo, de manera que se repite lo anterior, tomar el operador y la lista de sus operandos y tratar cada uno de sus operandos como expresiones en prefijo: , luego

y finalmente y evaluar. Los parntesis cuadrados son para ilustrar el ejemplo y no son necesarios para su evaluacin. 6. No hay nada que hacer, pues es un operador unario.

Haga un programa en C/C++ que transforme expresiones de entrefijo a prefijo, y de prefijo a entrefijo. Los caracteres vlidos son: las letras maysculas y minsculas, los nmeros enteros, los parntesis normales, los cuatro operadores y el operador unario .

Figura: Ilustracin del estacionamiento mencionado en el problema 2 2. en cierto punto de la ciudad hay un estacionamiento como el que se muestra en la figura 14, en donde hay lugar para 9 vehculos. haga un programa que muestre el manejo de este estacionamiento, considerando los siguientes requisitos: 1. Los vehculos proporcionan la siguiente informacin: Placas (6 digitos), Estado (2-3 caracteres, p.e. SON, DF, CHI, YUC), Marca, Modelo, AoModelo, Nombre del propietario. 2. Al llegar un veculo se acepta solamente si hay lugar disponible. 3. Validar todas las operaciones de la pila. 4. En cualquier momento se puede sacar algn vehculo del estacionamiento, regresando los vehculos en el orden en que estaban. 5. Toda la corrida del programa debe hacerse hacia/desde la terminal estndar. 3. Haga un programa que implemente 2 pilas en 1 arreglo A[1..n] de manera que ninguna pila se desborde a menos que el nmero de elementos en ambas pilas sea

Archivos de encabezados. Recomendacin: organizacin de archivos de encabezado. Todas las funciones en un mismo archivo de encabezado deben estar relacionadas a una misma funcin general. Dentro de un archivo de encabezado, la funciones que realicen tareas relacionadas deben estar agrupadas en una misma seccin. Recomendacin: nombres de los archivos de encabezado. Evitar nombres de archivos privados de encabezado que coincidan con nombres de archivos pblicos de encabezado. No usar nombes absolutos para archivos de encabezado; colocarlos en su ubicacin estndar o en el directorio corriente. La opcin de compilacin relativa a inclusin de bibliotecas ("include-path") es la mejor forma de manejar bibliotecas privadas extensas.

Norma: archivo de encabezado en el archivo de definicin de la funcin. Los archivos de encabezado que declaran funciones o variables externas deben inclurse en el archivo que define la funcin o la variable para permitir verificacin de tipos. Recomendacin: no anidar archivos de encabezado. Los archivos de encabezado no deben anidarse. El prlogo de cada archivo de encabezado debe describir que otros archivos de encabezado deben inclurse para que el actual archivode encabezado funcione. En casos extremos pueden inclurse todas las sentencias de inclusin comunes en un nuevo archivo de inclusin. Comentarios C Un comentario C es cualquier secuencia de caracteres contenida entre los delimitadores /* ... */. La totalidad de la secuencia, incluyendo los delimitadores /* y */ son sustituidos por un simple espacio despus de la expansin de macros (algunas implementaciones de C pueden eliminar los comentarios sin reemplazarlos por espacios). Ejemplo: int x = 2; /* esto es un comentario que ser eliminado o sustituido por un simple espacio despus en la frase de preprocesado. Como puede verse, el comentario puede ocupar varias lneas de texto en el cdigo fuente. Se recomienda utilizarlos con profusin, a veces todas las explicaciones son pocas, ya que el C++ es un lenguaje bastante crptico en algunas ocasiones, sobre todo algunas sentencias muy "elegantes" y comprimidas, pero ininteligibles en una primera lectura */ Ejemplo; la expresin: int /* declaracin */ i /* contador */; es analizada sintcticamente como estos tres tokens: int i y ; Comentarios C++ C++ admite comentarios de una sola lnea utilizando dos barras inclinadas ( // ) como seal de comienzo. El comentario empieza en este punto (incluyendo las seales de comienzo) y contina hasta el prximo carcter de nueva linea. class X { // esto es un comentario ... };

Comentarios Cuando se escriben programas es muy til agregar comentarios que ayuden a explicar lo que realiza un programa. En C++ se pueden utilizar dos tipos de comentarios al estilo C y al estilo C++. Al estilo C como se muestra a continuacin: /* Este es un comentario al estilo C */ Los comentarios al estilo C pueden continuar por varias lneas de un mismo archivo como se muestra en el siguiente cdigo: /* Este es un comentario al estilo C que puede ocupar varias lneas como se muestra a continuacin. */ Al estilo C++ slo pueden ocupar una lnea como en el siguiente cdigo: // Este es un comentario al estilo C++ === Utilizacin de cout === En un ejemplo anterior se utilizo cout, cout es un objeto que permite escribir en la consola, solo se utiliza con la directiva iostream su sintaxis es la siguiente: <source lang=cpp> cout << ALGO; Donde ALGO debe ser algo que cout sea capaz de imprimir. Ms adelante se trata ms sobre el. Tambin se utiliz endl, esto permite que el texto se escriba en una nueva lnea. Nota: cout puede ser utilizado de esta forma porque existen las siguientes lineas de cdigo. De otro modo habra un error de compilador. Este tema se trata en detalle ms adelante. #include <iostream> using namespace std;

Variables y constantes

Una variable, como su nombre lo indica, es un determinado objeto cuyo valor puede cambiar durante el proceso de una tarea especfica. Contrario a una variable, una constante es un determinado objeto cuyo valor no puede ser alterado durante el proceso de una tarea especfica. En C, C++ para declarar variables no existe una palabra especial, es decir, las variables se declarn escribiendo el tipo seguido de uno o ms identificadores o nombres de variables. Por otro lado, para declarar constantes existe la palabra reservada const, as como la directiva #define. A continuacin se muestran ejemplos de declaracin de variables y constantes. Variables Constantes const int a = 100; const float b = 100; Constantes #define 100 #define 100 a

int a;

float b;

Notas: A diferencia de las constantes declaradas con la palabra const los smbolos definidos con #define no ocupan espacio en la memoria del cdigo ejecutable resultante. El tipo de la variable o constante puede ser cualquiera de los listados en Tipos primitivos, o bien de un tipo definido por el usuario. Las constantes son usadas a menudo con un doble propsito, el primero es con el fin de hacer ms legible el cdigo del programa, es decir, si se tiene (por ejemplo) la constante numerica 3.1416 y esta representa al pi, entonces podemos hacer declaraciones tales como: #define pi 3.1416

En este caso podremos usar la palabra pi en cualquier parte del programa y el compilador se encargar de cambiar dicho simbolo por 3.1416. o bien, const pi = 3.1416;

En este otro caso podremos usar la palabra pi en cualquier parte del programa y el compilador se encargar de cambiar dicho smbolo por una referencia a la constante pi guardada en la memoria.

De momento slo veremos los tipos fundamentales, que son: void, char, int, float y double, en C++ se incluye tambin el tipo bool. Tambin existen ciertos modificadores, que permiten ajustar ligeramente ciertas propiedades de cada tipo; los modificadores pueden ser: short, long, signed y unsigned, y pueden combinarse algunos de ellos. Tambin veremos en este captulo los tipos enumerados, enum.

Tipo "int" o entero: [signed|unsigned] [short|long] int <identificador>[,<identificador2>[,<identificador3>]...]; [signed|unsigned] long [int] <identificador>[,<identificador2>[,<identificador3>]...]; [signed|unsigned] short [int] <identificador>[,<identificador2>[,<identificador3>]...]; Las variables enteras almacenan nmeros enteros dentro de los lmites de cada uno de sus tamaos. A su vez, esos tamaos dependen de la plataforma, del compilador, y del nmero de bits que use por palabra de memoria: 8, 16, 32... No hay reglas fijas para saber el tamao, y por lo tanto, el mayor nmero que podemos almacenar en cada tipo entero: short int, int o long int; depende en gran medida del compilador y del sistema operativo. Slo podemos estar seguros de que el tamao de un short int es menor o igual que el de un int, y ste a su vez es menor o igual que el de un long int. Veremos cmo averiguar estos valores cuando estudiemos los operadores. A cierto nivel, podemos considerar los tipos char, short int, int y long int como tipos enteros diferentes. Pero esa diferencia consiste slo en el tamao del valor mximo que pueden contener, y en el tamao que ocupan en memoria, claro. Este tipo de variables es til para almacenar nmeros relativamente grandes, pero sin decimales, por ejemplo el dinero que tienes en el banco, (salvo que seas Bill Gates), o el nmero de lentejas que hay en un kilo de lentejas. Tipo "long long": [signed|unsigned] long long [int] <identificador>[,<identificador2>[,<identificador3>]...];

Este tipo no pertenece al estandar ANSI, sin embargo, est disponible en compiladores GNU, como el que se usa en Linux o el que usa el propio Dev-C++ (y otros entornos de desarrollo para Windows). Este tipo ocupa el siguiente puesto en cuanto a tamao, despus de long int. Como en los otros casos, su tamao no est definido, pero s sabemos que ser mayor o igual que el de long int. Tipo "float" o coma flotante: float <identificador>[,<identificador2>[,<identificador3>]...]; Las variables de este tipo almacenan nmeros en formato de coma flotante, esto es, contienen un valor de mantisa y otro de exponente, que, para entendernos, codifican nmeros con decimales. Aunque el formato en que se almacenan estos nmeros en un ordenador es binario, podemos ver cmo es posible almacenar nmeros muy grandes o muy pequeos mediante dos enteros relativamente pequeos, usando potencias en base 10. Por ejemplo, tenemos para la mantisa un valor entero, m, entre -0.99 y 0.99, y para el exponente un valor, e entre -9 y 9. Los nmeros se interpretan como m x 10e. Este formato nos permite almacenar nmeros entre -0.99 x 109 y 0.99 x 109. Es decir, entre -990000000 y 99000000. Y tambin nmeros tan pequeos como 0.01 x 10-9 -0.01 x 10-9. Es decir, como 0,00000000001 -0,00000000001. Esto slo con tres dgitos decimales, ms los signos. Pero en un ordenador se usa aritmtica binaria. Por ejemplo, para un tipo float tpico de 32 bits, se usa un bit de signo para la mantisa y otro para el exponente, siete bits para el exponente y 23 para la mantisa. Para ms detalles se puede consultar el siguiente enlace: representacin de los nmeros en punto flotante. Estas variables son aptas para variables de tipo real, como por ejemplo el cambio entre euros y dlares. O para nmeros muy grandes, como la produccin mundial de trigo, contada en granos.

Pero el fuerte de estos nmeros no es la precisin, sino el orden de magnitud, es decir lo grande o pequeo que es el nmero que codifica. Por ejemplo, la siguiente cadena de operaciones no dar el resultado correcto: float a = 12335545621232154; a = a + 1; a = a - 12335545621232154; Finalmente, "a" valdr 0 y no 1, como sera de esperar. Los formatos en coma flotante sacrifican precisin en favor de tamao. Sin embargo el ejemplo si funcionara con nmeros ms pequeos. Esto hace que las variables de tipo float no sean muy adecuadas para todos los casos, como veremos ms adelante. Puede que te preguntes (alguien me lo ha preguntado), qu utilidad tiene algo tan impreciso. La respuesta es: aquella que t, como programador, le encuentres. Te aseguro que float se usa muy a menudo. Por ejemplo, para trabajar con temperaturas, la precisin es suficiente para el margen de temperaturas que normalmente manejamos y para almacenar al menos tres decimales. Pero hay millones de otras situaciones en que resultan muy tiles. Tipo "bool" o Booleano: bool <identificador>[,<identificador2>[,<identificador3>]...]; Las variables de este tipo slo pueden tomar dos valores true (verdadero) o false (falso). Sirven para evaluar expresiones lgicas. Este tipo de variables se puede usar para almacenar respuestas, por ejemplo: Posees carn de conducir?. O para almacenar informaciones que slo pueden tomar dos valores, por ejemplo: qu mano usas para escribir. En estos casos debemos acuar una regla, en este ejemplo, podra ser diestro>true, zurdo->false. bool respuesta; bool continuar; Nota: En algunos compiladores de C++ antiguos no existe el tipo bool. Lo lgico sera no usar esos compiladores, y conseguir uno ms actual. Pero si esto no es posible, se puede simular este tipo a partir de un enumerado. enum bool {false=0, true}; Tipo "double" o coma flotante de doble precisin: [long] double <identificador>[,<identificador2>[,<identificador3>]...];

Las variables de este tipo almacenan nmeros en formato de coma flotante, mantisa y exponente, al igual que float, pero usan una precisin mayor, a costa de usar ms memoria, claro. Son aptos para variables de tipo real. Usaremos estas variables cuando trabajemos con nmeros grandes, pero tambin necesitemos gran precisin. El mayor espacio para almacenar el nmero se usa tanto para ampliar el rango de la mantisa como el del exponente, de modo que no slo se gana en precisin, sino tambin en tamao. Al igual que pasaba con los nmeros enteros, no existe un tamao predefinido para cada tipo en coma flotante. Lo que s sabemos es que el tamao de double es mayor o igual que el de float y el de long double mayor o igual que el de double. Lo siento, pero no se me ocurre ahora ningn ejemplo en el que sea til usar uno de estos tipos. Bueno, tambin me han preguntado por qu no usar siempre double o long double y olvidarnos de float. La respuesta es que C++ siempre ha estado orientado a la economa de recursos, tanto en cuanto al uso de memoria como al uso de procesador. Si tu problema no requiere la precisin de un double o long double, por qu derrochar recursos? Por ejemplo, en el compilador Dev-C++ float requiere 4 bytes, double 8 y long double 12, por lo tanto, para manejar un nmero en formato de long double se requiere el triple de memoria y el triple o ms tiempo de procesador que para manejar un float. Como programadores estamos en la obligacin de no desperdiciar nuestros recursos, y mucho menos los recursos de nuestros clientes, para los que crearemos nuestros programas. C++ nos dan un gran control sobre estas caractersticas, es nuestra responsabilidad aprender a usarlo como es debido. Tipo "void" o sin tipo: void <identificador>[,<identificador2>[,<identificador3>]...]; En realidad esta sintaxis es errnea: no se pueden declarar variables de tipo void, ya que tal cosa no tiene sentido. void es un tipo especial que indica la ausencia de tipo. Se usa para indicar el tipo del valor de retorno en funciones que no devuelven ningn valor, y tambin para indicar la ausencia de parmetros en funciones que no los requieren, (aunque este uso slo es obligatorio en C, y opcional en C++), tambin se usar en la declaracin de punteros genricos, aunque esto lo veremos ms adelante. Las funciones que no devuelven valores parecen una contradiccin. En lenguajes como Pascal, estas funciones se llaman procedimientos. Simplemente hacen su trabajo, y no revuelven valores. Por ejemplo, una funcin que se encargue de borrar la pantalla, no tienen nada que devolver, hace su trabajo y regresa. Lo mismo se aplica a las funciones sin

parmetros de entrada, el mismo ejemplo de la funcin para borrar la pantalla no requiere ninguna entrada para poder realizar su cometido. Tipo "enum" o enumerado: enum [<identificador_de_enum>] { <nombre> [= <valor>], ...} <identificador>[,<identificador2>[,<identificador3>]...]; enum <identificador_de_enum> { <nombre> [= <valor>], ...} [<identificador>[,<identificador2>[,<identificador3>]...]]; Se trata de una sintaxis ms elaborada que las que hemos visto hasta ahora, pero no te asustes, (si es que te ha asustado esto) cuando te acostumbres a ver este tipo de cosas comprobars que son fciles de comprender. Este tipo nos permite definir conjuntos de constantes enteras, llamados datos de tipo enumerado. Las variables declaradas de este tipo slo podrn tomar valores dentro del dominio definido en la declaracin. Vemos que hay dos sintaxis. En la primera, el identificador de tipo es opcional, y si lo usamos podremos declarar ms variables del tipo enumerado en otras partes del programa: [enum] <identificador_de_enum> <identificador>[,<identificador2>[,<identificador3>]...]; La segunda sintaxis nos permite aadir una lista de variables, tambin opcional. De este modo podemos separar la definicin del tipo enumerado de la declaracin de variables de ese tipo: enum orden {primero=1, segundo, tercero}; ... enum orden id1, id2, id3; O podemos hacer ambas cosas en la misma sentencia: definicin y declaracin: enum orden {primero=1, segundo, tercero} id1, id2, id3; Si decidimos no usar un identificador para el enumerado slo podremos declarar variables en ese momento, y no en otros lugares del programa, ya que no ser posible referenciarlo: enum {primero=1, segundo, tercero} uno, dos; Varios identificadores pueden tomar el mismo valor, pero cada identificador slo puede usarse en un tipo enumerado. Por ejemplo:

enum tipohoras { una=1, dos, tres, cuatro, cinco, seis, siete, ocho, nueve, diez, once, doce, trece=1, catorce, quince, dieciseis, diecisiete, dieciocho, diecinueve, veinte, ventiuna, ventidos, ventitres, venticuatro = 0}; En este caso, una y trece valen 1, dos y catorce valen 2, etc. Y veinticuatro vale 0. Como se ve en el ejemplo, una vez se asigna un valor a un elemento de la lista, los siguientes toman valores correlativos. Si no se asigna ningn valor, el primer elemento tomar el valor 0. Los nombres de las constantes pueden utilizarse en el programa, pero no pueden ser ledos ni escritos. Por ejemplo, si el programa en un momento determinado nos pregunta la hora, no podremos responder doce y esperar que se almacene su valor correspondiente. Del mismo modo, si tenemos una variable enumerada con el valor doce y la mostramos por pantalla, se mostrar 12, no doce. Deben considerarse como "etiquetas" que sustituyen a enteros, y que hacen ms comprensibles los programas. Insisto en que internamente, para el compilador, slo son enteros, en el rango de valores vlidos definidos en cada enum. La lista de valores entre las llaves definen lo que se denomina el "dominio" del tipo enumerado. Un dominio es un conjunto de valores posibles para un dato. Una variable del tipo enumerado no podr tomar jams un valor fuera del dominio. Operadores aritmticos ^ Son usados para crear expresiones matemticas. Existen dos operadores aritmticos unitarios, '+' y '-' que tienen la siguiente sintaxis: + <expresin> - <expresin> Asignan valores positivos o negativos a la expresin a la que se aplican. En cuanto a los operadores binarios existen varios. '+', '-', '*' y '/', tienen un comportamiento anlogo en cuanto a los operandos, ya que admiten tanto expresiones enteras, como en coma flotante. Sintaxis: <expresin> + <expresin> <expresin> - <expresin> <expresin> * <expresin> <expresin> / <expresin>

Evidentemente se trata de las conocidsimas operaciones aritmticas de suma, resta, multiplicacin y divisin, que espero que ya domines a su nivel tradicional, es decir, sobre el papel. Otro operador binario es el de mdulo '%', que devuelve el resto de la divisin entera del primer operando entre el segundo. Por esta razn no puede ser aplicado a operandos en coma flotante. <expresin> % <expresin> Nota: Esto quizs requiera una explicacin: Veamos, por ejemplo, la expresin 17 / 7, es decir 17 dividido entre 7. Cuando aprendimos a dividir, antes de que supiramos sacar decimales, nos ensearon que el resultado de esta operacin era 2, y el resto 3, es decir 2*7+3 = 17. En C++, cuando las expresiones que intervienen en una de estas operaciones sean enteras, el resultado tambin ser entero, es decir, si 17 y 7 se almacenan en variables enteras, el resultado ser entero, en este caso 2. Por otro lado si las expresiones son en punto flotante, con decimales, el resultado ser en punto flotante, es decir, 2.428571. En este caso: 7*2.428571=16.999997, o sea, que no hay resto, o es muy pequeo. Por eso mismo, calcular el resto, usando el operador %, slo tiene sentido si las expresiones implicadas son enteras, ya que en caso contrario se calcularn tantos decimales como permita la precisin de tipo utilizado. Siguiendo con el ejemplo, la expresin 17 % 7 dar como resultado 3, que es el resto de la divisin entera de 17 dividido entre 7. Por ltimo otros dos operadores unitarios. Se trata de operadores un tanto especiales, ya que slo pueden trabajar sobre variables, pues implican una asignacin. Se trata de los operadores '++' y '--'. El primero incrementa el valor del operando y el segundo lo decrementa, ambos en una unidad. Existen dos modalidades, dependiendo de que se use el operador en la forma de prefijo o de sufijo. Sintaxis: <variable> ++ (post-incremento) ++ <variable> (pre-incremento)

<variable>-- (post-decremento) -- <variable> (pre-decremento) En su forma de prefijo, el operador es aplicado antes de que se evale el resto de la expresin; en la forma de sufijo, se aplica despus de que se evale el resto de la expresin. Veamos un ejemplo, en las siguientes expresiones "a" vale 100 y "b" vale 10: c = a + ++b; En este primer ejemplo primero se aplica el pre-incremento, y b valdr 11 a continuacin se evala la expresin "a+b", que dar como resultado 111, y por ltimo se asignar este valor a c, que valdr 111. c = a + b++; En este segundo ejemplo primero se avala la expresin "a+b", que dar como resultado 110, y se asignar este valor a c, que valdr 110. Finalmente se aplica en post-incremento, y b valdr 11. Los operadores unitarios sufijos (post-incremento y post-decremento) se evalan despus de que se han evaluado el resto de las expresiones. En el primer ejemplo primero se evala ++b, despus a+b y finalmente c =<resultado>. En el segundo ejemplo, primero se evala a+b, despus c = <resultado> y finalmente b++. Es muy importante no pensar o resolver las expresiones C como ecuaciones matemticas, NO SON EXPRESIONES MATEMATICAS. No veas estas expresiones como ecuaciones, NO SON ECUACIONES. Esto es algo que se tarda en comprender al principio, y que despus aprendes y dominas hasta el punto que no te das cuenta. Por ejemplo, piensa en esta expresin: b = b + 1; Supongamos que inicialmente "b" vale 10, esta expresin asignar a "b" el valor 11. Veremos el operador "=" ms adelante, pero por ahora no lo confundas con una igualdad matemtica. En matemticas la expresin anterior no tiene sentido, en programacin s lo tiene. Volviendo al ejemplo de los operadores de pre-incremento y post-incremento, la primera expresin equivale a: b = b+1; c = a + b;

La segunda expresin equivale a: c = a + b; b = b+1; Esto tambin proporciona una explicacin de por qu la versin mejorada del lenguaje C se llama C++, es simplemente el C incrementado. Y ya que estamos, el lenguaje C se llama as porque las personas que lo desarrollaron crearon dos prototipos de lenguajes de programacin con anterioridad a los que llamaron B y BCPL. Operadores lgicos Los operadores "&&", "||" y "!" relacionan expresiones lgicas, dando como salida a su vez nuevas expresiones lgicas. Sintaxis: <expresin1> && <expresin2> <expresin1> || <expresin2> !<expresin> El operador "&&" equivale al "AND" o "Y"; devuelve true slo si los dos operandos true o lo que es equivalente, distintas de cero. En cualquier otro caso el resultado es false. El operador "||" equivale al "OR" u "O inclusivo"; devuelve true si cualquiera de las expresiones evaluadas es true, o distinta de cero, en caso contrario devuelve false. El operador "!" es equivalente al "NOT", o "NO", y devuelve true cuando la expresin evaluada es false o cero, en caso contrario devuelve false. Cortocircuito Existe una regla que en muchas ocasiones nos puede resultar til, ya que nos puede ahorrar tiempo y comprobaciones adicionales. Esta regla se conoce como "cortocircuito" o "shortcut", y se aplica de forma diferente a expresiones AND y OR. En el caso de operaciones AND, consiste en que si la primera expresin evaluada es false, la segunda si siquiera se evala, ya que el resultado ser siempre false independientemente del valor del segundo operando. En el caso de operaciones OR, si la primera expresin sea true, la segunda no se evala, ya que el resultado ser siempre true, independientemente del valor de la segunda expresin.

Esto es porque en una operacin && el resultado slo puede ser true cuando los dos operandos sean true, y en una operacin || el resultado slo puede ser false si ambos operandos son false. En el momento en que en una expresin AND uno de los operandos sea false, o que en una expresin OR uno de los operandos sea true, el valor del otro operando es irrelevante. Si tenemos en cuenta este comportamiento, podremos ahorrar tiempo de ejecucin si colocamos en primer lugar la expresin ms fcil de calcular, o aquella cuyo valor sea ms probablemente false en el caso de una expresin AND o true, para una expresin OR. Tambin habr casos en que una de las expresiones sea indeterminada cuando la otra sea false en una expresin AND, o true en una expresin OR. En ese caso, ser preferible colocar la expresin potencialmente indeterminada en el segundo lugar. Tablas de verdad Una tabla de verdad es una relacin de todos los posibles valores para los operandos que intervienen en una operacin, y los resultados para cada caso. En el caso de operadores lgicos podemos mostrar fcilmente tablas de verdad, ya que el dominio para cada operando es muy reducido: true o false. Si adems tenemos en cuenta la regla del cortocircuito, los casos posibles se reducen todava ms. A continuacin se muestra la tabla de verdad del operador &&: Expresin1 Expresin2 false false true &&

Expresin1 Expresin2 ignorada false true

false true true

La tabla de verdad para el operador || es: Expresin1 Expresin2 false ||

Expresin1 Expresin2

false

false

false true

true ignorada

true true

La tabla de verdad para el operador ! es: Expresin false true !Expresin true false

Expresiones lgicas frecuentes A menudo aprovechamos ciertas equivalencias entre enteros y valores lgicos para comprobar algunos valores especiales en comparaciones usadas en condiciones o bucles. Concretamente, me refiero a las comparaciones con cero. As, si queremos saber si un valor entero E, es distinto de cero, lo comparamos usando el operador !=: 0!=E. Pero existe una correspondencia entre todos los valores enteros y los valores booleanos, y esa correspondencia es muy simple: un valor entero nulo esquivale a false, cualquier valor entero distinto de cero, equivale a true. Teniendo esto en cuenta, la comparacin anterior es inncecesaria, ya que 0!=E es equivalente a usar, sencillamente E. La condicin contraria, 0==E, es por lo tanto equivalente a lo contrario, es decir, a la expresin !E. Ser pues, muy frecuente, que encuentres este tipo de operadores lgicos aplicados a enteros en condiciones: if(!E) \ // Si E es cero, hacer ... if(E) \ // Si E no es cero, hacer...

Los operadores incremento (++) y decremento (--)

En lenguaje C, tanto el operador incremento (++) como el operador decremento (--) actan siempre sobre un solo operando, normalmente una variable. Por tanto, son operadores monarios, y sirven para incrementar o decrementar en una unidad el valor de dicho operando. Ejemplo int r = 8, s = 3; 1: Declaradas las variables:

se pueden escribr las instrucciones de expresin: r++; s--;

Dichas instrucciones son equivalentes a: r = r + 1; s = s - 1; Y tambin se pueden escribir como: ++r; --s; Tras su ejecucin, el aspecto de la memoria ser:

En estas instrucciones, ambos operadores se pueden escribir, indistintamente, antes o despus de los operandos sobre los que actan. Pero, cuando en una expresin, adems del operador incremento o decremento, tambin aparecen otros operadores, entonces s que hay que tener en cuenta la diferencia que supone el escribirlos antes o despus. Ejemplo 2: A partir de las variables: int i = 5, j, k = 5, m;

Si se ejecutan las instrucciones: j = i++; m = ++k; Los valores de las variables en memoria sern:

Obsrvese que, los valores de j y m son diferentes. Esto es debido a que, cuando se evala la expresin j = i++, en primer lugar, se le asigna a j el valor de i (es decir, un 5) y, a continuacin, se incrementa el valor de la variable i. Por el contrario, cuando se evala la expresin m = ++k, primero, se incrementa el valor de k (de 5 pasa a ser 6) y, despus, este nuevo valor de k se le asigna a m. En resumen, cuando en una expresin el operador incremento (++) o decremento (--) precede al operando sobre el que acta (por ejemplo ++k), antes de utilizar el valor de dicho operando para otro propsito, este se incrementa. De ser al revs, es decir, si es el operando quien precede al operador (por ejemplo i++), el valor de dicho operando se incrementa despus de ser utilizado para otro fin. Operadores de asignacin En lenguaje C existen expresiones de asignacin y, para escribirlas, se utilizan los siguientes operadores de asignacin:

Figura. Clasificacin de los operadores de asignacin en C.

De ellos, el ms utilizado es el operador de asignacin (=). Su funcionalidad es equiparable a la de una instruccin de asignacin en psedocdigo, y su sintaxis es muy similar.

<nombre_de_la_variable> = <expresin>;

Existen dos diferencias: 1. En vez del smbolo reservado flecha izquierda ( ), se utiliza el carcter igual (=). 2. Se debe escribir un punto y coma (;) al final. Ejemplo 1: Partiendo de la constante simblica #define PI 3.141592 y de las variables float area, longitud, radio; Una instruccin de asignacin puede ser: Radio = 5.78; Tcnicamente, en lenguaje C, una asignacin (=) es una operacin, al igual que lo es una suma (+) o una resta (-). En consecuencia, radio = 5.78 es una expresin de asignacin, que entra dentro de la categora de las instrucciones de expresin.

<instruccin_de_expresin>;

De la evaluacin de una expresin de asignacin siempre se obtiene el mismo valor que el asignado a la variable, en este caso, 5.78. Si ahora escribimos: area = PI * pow( radio, 2 ); longitud = 2 * PI * radio; De la evaluacin de estas instrucciones de expresin se obtienen los valores 57.046290 y 36.316804, los cuales coinciden con los valores asignados a las variables area y longitud, respectivamente. Cuando el operador de asignacin (=) se escribe precedido de un operador aritmtico: suma (+), resta (-), multiplicacin (*), divisin (/) o mdulo (%), la unin de ambos se convierte en un nuevo operador de asignacin que opera de la siguiente manera: "A la variable se le asigna el valor <variable> <operador_aritmtico> <expresin>." que se obtiene de evaluar

Ejemplo 2: Dada la siguiente declaracin de variables: int m = 4, n = 1;

se puede escribir la instruccin de expresin m += 3; que es equivalente a la instruccin m = m + 3; En la memoria, cambiar el valor almacenado en el espacio representado por la variable m.

Si, a continuacin, se ejecuta la instruccin m *= n += 2; ahora, los valores de las variables m y n son:

Primero, se evala la expresin n += 2 (equivalente a n = n + 2). Esto produce que a la

variable n se le asigne un 3. En segundo lugar, se evala la expresin m *= 3 (equivalente a m = m * 3), asignndosele a la variable m el valor 21.

Las funciones printf y scanf, la utilizaremos para mostrar e ingresar informacin respectivamente. Ejemplos de Printf printf("Hola printf("Funcin printf, para mostrar informacin en Mundo"); pantalla");

Antes de mostrar algun ejemplo de scanf, hay que comentar tambien los especificadores de formatos, los mismos son los que establecen el formato de entrada ( en este caso ) o salida de los argumentos especificados. Ejemplo scanf("%d",&numeroEntero); scanf("%f",&numeroFlotante); scanf("%c",&letra); En estos ejemplos lo que hacemos es asignar a numeroEntero, numeroFlotante y letra el valor que ingresemos por teclado, no olvidar anteponer delante de cada variable el &.Los especificadores de formato depende de la variable que le asignemos: Para Para Para %d, %f, %c, se se se debe debe debe asignar asignar asignar una una una variable variable variable del del del tipo tipo tipo int float char

Esto se aplica tambien con los printf, pero en estos casos no es necesario anteponer el &. printf("El nmero entero es %f",numeroEntero,numeroFlotante); printf("La letra que %d y falta el nmero sera flotante es

%c",letra);

Para el primer printf se especifican dos valores a mostrar, los mismos se muestran en el orden que le especifiquemos y separados por comas las variables.

Tener en cuenta que cuando asignamos un valor mediante scanf, no es posible realizar lo siguiente: scanf(%c, %d, %f",&letra,&numerEntero,&numeroFlotante);

Programa Ejemplo: En el siguiente codigo, ingresamos un nmero y lo mostramos por pantalla. #include "stdio.h" #include "conio.h" void main() { float Numero; // Declaramos un flotante denominado Numero printf("Ingrese un numero:"); scanf("%d",&Numero); printf("\nEl numero ingresado es %f",Numero); getch(); // Es para que el programa se detenga. /* En pantalla va a mostrar,en caso de haber tipeado 10 El numero ingresado es 10.000000 Es con digitos por que es un tipo de dato float En caso de querer mostrar menos digitos decimales se deberia agregar al especificador de formato %f por ejemplo para que muestre 2 decimales %.2f quedando printf("El numero ingresado es %.2f",Numero); */

} Secuencias de Escape

Las secuencias de escape se utilizan para que el compilador interprete de diferente forma la salida de la informacin a mostrar, por ejemplo: \n (Salto de Linea ) \t ( Tabulador ) \b ( Backspace ) \r ( Retroceso del carro ) \a ( Suena Parlante interno de la pc ) \\ ( Muestra \ )

\" ( Muestra " )

Diferencias printf/scanf En printf los argumentos son expresiones, pero en scanf los argumentos han de ser direcciones dememoria (punteros). Para obtener la direccin de una variable se ha de utilizar el operador &: &variable.En el caso de los arrays, el puntero apunta a el primer elemento del vector.La funcin printf devuelve un valor entero que contiene el nmero de caracteres escritos. En caso deerror, devuelve EOF. La funcin scanf devuelve el nmero de campos que han sido asignados. Si ocurre un error o se detecta elfin de fichero, se devuelve EOF.En la cadena de control de scanf se pueden distinguir tres elementos:1. Especificadores de formato.2. Caracteres con espacios en blanco.3. Caracteres sin espacios en blanco.Un espacio en blanco en la cadena de control da lugar a que scanf() salte uno o ms espacios en blanco enel flujo de entrada. Un carcter blanco es un espacio, un tabulador o un carcter de nueva lnea.Un carcter que no sea espacio en blanco lleva a scanf() a leer y eliminar el carcter asociado. Por ejemplo, %d,%d da lugar a que scanf() lea primero un entero, entonces lea y descarte la coma, yfinalmente lea otro entero. Si el carcter especificado no se encuentra, scanf() termina.

putchar y getchar Comenzaremos con las dos funciones principales de salida y entrada de caracteres: putchar y getchar. La funcin putchar escribe un nico carcter en la salida estndar. Su uso en sencillo y generalmente est implementada como una macro en la cabecera de la biblioteca estndar. Por ejemplo: #include <stdio.h> main() {

putchar('H'); putchar('o'); putchar('l'); putchar('a'); putchar(32);

putchar('m'); putchar('u'); putchar('n'); putchar('d'); putchar('o'); } putchar('\n');

El resultado es: Hola mundo En el cdigo anterior putchar(32); muestra el espacio entre ambas palabras (32 es el cdigo ASCII del carcter espacio ' ') y putchar('\n'); imprime un salto de lnea tras el texto. La funcin getchar devuelve el carcter que se halle en la entrada estndar. Esta funcin tiene dos particularidades. La primera es que aunque se utiliza para obtener caracteres no devuelve un carcter, sino un entero. Esto se hace as ya que con un entero podemos representar tanto el conjunto de caracteres que cabe en el tipo carcter (normalmente el conjunto ASCII de caracteres) como el carcter EOF de fin de fichero. En UNIX es habitual representar los caracteres usando el cdigo ASCII, tanto en su versin de 7 bits como en su versin ampliada a 8 bits. Estos caracteres se suelen representar como un entero que va del 0 al 127 o 256. El carcter EOF entonces es representado con un -1. Adems esto tambin lo aplicaremos cuando leamos los ficheros binarios byte a byte. Un ejemplo: #include <stdio.h> main() {

int c; c = getchar(); putchar(c); /* Ntese que getchar() no devuelve nada hasta que se presiona ENTER */

Aqu se almacena en el entero c el carcter pulsado en el teclado. Posteriormente se muestra con putchar.

puts y gets La funcin puts simplemente imprime una cadena de caracteres en la salida estndar (y produce un salto de lnea). Le debemos proporcionar la direccin donde encontrar la cadena de caracteres. El cdigo: #include <stdio.h> main() { }

puts("Bienvenido a la programacin"); puts(" en lenguaje C");

produce el resultado: Bienvenido en lenguaje C a la programacin

La funcin gets simplemente toma una cadena de caracteres de la entrada estndar (cuya introduccin es preciso terminar con un ENTER) y la almacena en una variable string. Supongamos este cdigo: #include <stdio.h> main() {

char cadena[50]; puts("Escriba un texto:"); gets(cadena); puts("El texto escrito es:"); puts(cadena);

La declaracin char cadena[50]; crea una variable llamada cadena que puede almacenar hasta 50 caracteres. Este cdigo produce, cuando escribimos con el teclado el texto Bienvenido a la programacin en lenguaje C, el resultado: Escriba un texto:

Bienvenido a la programacin en El texto escrito Bienvenido a la programacin en lenguaje C

lenguaje

C es:

Esta funcin nos permite introducir frases enteras, incluyendo espacios. Algunos detalles ms; la sintaxis es: char *gets(char *buffer); Si se ha almacenado algn carcter en buffer le aade un '\0' al final y devuelve un puntero a su direccin. Si no se ha almacenado ninguno (error o carcter fin-de-fichero, CTRL+Z) devuelve un puntero NULL. #include <stdio.h> main() {

char cadena[50]; char *p; puts("Escriba un texto:"); p = gets(cadena); if (p) { puts("El texto escrito es:"); puts(cadena); } else puts("No se ha guardado nada.");

Esta funcin es un puede ser peligrosa porque no comprueba si nos hemos pasado del espacio reservado (de 50 caracteres en este ejemplo: 49 caracteres + '\0').

Prototipo: int kbhit (void); Archivo de cabecera: conio.h Explicacin: Esta funcin no est definida como parte de la ANSI C / C + + estndar. Se utiliza generalmente por la familia de Borland de los compiladores. Devuelve un entero distinto de cero si la clave est en el buffer del teclado. No va a esperar a que la clave para ser presionado.

Revisa si una tecla pulsada est disponible. Cualesquier pulsadas disponibles pueden ser recogidas con las funciones getch o getche. La funcin kbhit retorna 0 si no se ha registrado una pulsada de tecla; si hay una disponible, entonces el valor retornado es distinto a cero. Ejemplo: / Se / Ejemplo de bucle hasta que se pulsa una tecla / / Ejemplo de no trabajar con todos los compiladores # Include <conio.h> # Include <iostream> using namespace std; int main () { while (1) { if (kbhit ()) { break; } } }

PROPOSICION IF - ELSE Esta proposicin sirve para ejecutar ciertas sentencias de programa , si una expresin resulta CIERTA otro grupo de sentencias, si aquella resulta FALSA. Su interpretacin literal sera : SI es CIERTA tal cosa , haga tal otra , si no lo es saltela . El caso ms sencillo sera : if(expresin) sentencia ; if(expresin) sentencia ; Cuando la sentencia que sigue al IF es nica, las dos formas de escritura expresadas arriba son equivalentes . La sentencia slo se ejecutar si el resultado de "expresin" es distinto

de cero (CIERTO) , en caso contrario el programa saltear dicha sentencia , realizando la siguiente en su flujo. PROPOSICION SWITCH El SWITCH es una forma sencilla de evitar largos , tediosos y confusos anidamientos de ELSE-IF . Supongamos que estamos implementando un Menu , con varias elecciones posibles . El esqueleto de una posible solucin al problema usando if-else podra ser el siguiente : #include <<stdio.h>> main() { int c ; printf("\nMENU :") ; printf("\n A = ADICIONAR A LA LISTA ") ; printf("\n B = BORRAR DE LA LISTA ") ; printf("\n O = ORDENAR LA LISTA ") ; printf("\n I = IMPRIMIR LA LISTA ") ; printf("\n\nESCRIBA SU SELECCION , Y LUEGO <<ENTER>> : ") ; if( (c = getchar()) != '\n' ) { if( c == 'A') printf("\nUD. SELECCIONO AGREGAR") ; else if( c == 'B') printf("\nUD. SELECCIONO BORRAR") ; else if( c == 'O' ) printf("\nUD. SELECCIONO ORDENAR") ; else if( c == 'I' ) printf("\nUD. SELECCIONO IMPRIMIR") ; else printf("\n\a\aUD. APRETO UN CARACTER ILEGAL" ) ; } else printf("\n UD. NO HA SELECCIONADO NADA !" ) ; } El SWITCH empieza con la sentencia : switch (expresin) . La expresin contenida por los parntesis debe ser ENTERA , en nuestro caso un caracter ; luego mediante una llave abre el bloque de las sentencias de comparacin . Cada una de ellas se representa por la

palabra clave "case" seguida por el valor de comparacin y terminada por dos puntos . Seguidamente se ubican las sentencias que se quieren ejecutar , en el caso que la comparacin resulte CIERTA . En el caso de resultar FALSA , se realizar la siguiente comparacin , y as sucesivamente . Prestemos atencin tambien a la sentencia BREAK con la que se termina cada CASE. Una caracterstica poco obvia del SWITCH , es que si se eliminan los BREAK del programa anterior , al resultar CIERTA una sentencia de comparacin, se ejecutarn las sentencias de ese CASE particular pero TAMBIEN la de todos los CASE por debajo del que ha resultado verdadero. Quizs se aclare esto diciendo que , las sentencias propias de un CASE se ejecutarn si su comparacin otra comparacin ANTERIOR resulta CIERTA . La razn para este poco "juicioso" comportamiento del SWITCH es que as se permite que varias comparaciones compartan las mismas sentencias de programa , por ejemplo : ................. case 'X' : case 'Y' : case 'Z' : printf(" UD. ESCRIBIO X , Y , Z ") ; break ; .................. La forma de interrumpir la ejecucin luego de haber encontrado un CASE cierto es por medio del BREAK , el que d por terminado el SWITCH . Al final del bloque de sentencias del SWITCH , aparece una optativa llamada DEFAULT , que implica : si no se ha cumplido ningun CASE , ejecute lo que sigue. Es algo superfluo poner el BREAK en este caso , ya que no hay ms sentencias despues del DEFAULT , sin embargo , como el orden en que aparecen las comparaciones no tiene importancia para la ejecucin de la instruccin, puede suceder que en futuras correcciones del programa se agregue algn nuevo CASE luego del DEFAULT , por lo que es conveniente preveerlo , agregando el BREAK , para evitar errores de laboriosa ubicacin . Ms adelante volveremos sobre otros usos del BREAK. EL BUCLE while El lenguaje de programacin C contiene varias instrucciones condicionales y de bucle, en este captulo las trataremos todas ellas empezando con el bucle while. El bucle while se ejecuta mientras una condicin es cierta. Cuando esta condicin se torna falsa, el bucle termina su operacin. Veamos el siguiente ejemplo:

/* Este es un ejemplo del bucle while. */ # include <stdio.h> int main() { int contador; contador = 0; while (contador < 6) { printf ("El valor de contador es %d\n", contador); contador = contador + 1; } return 0 ;

/ * Resultado de la ejecucin del programa El valor de contador es 0 El valor de contador es 1 El valor de contador es 2 El valor de contador es 3 El valor de contador es 4 El valor de contador es 5 */ En este programa empezamos con un comentario y el punto de entrada main ( ), despus definimos una variable de tipo entero a la que llamamos contador dentro del cuerpo del programa, esta variable es inicializada a cero para despus entrar en el bucle while. La sintaxis del bucle while es justamente como se muestra en el programa. A la palabra clave while le sigue una expresin de algo entre parntesis y luego una serie de enunciados encerrados entre llaves. Tan pronto como la expresin entre parntesis es verdadera todos los enunciados entre las llaves se ejecutarn repetidamente. En este caso, debido a que la variable contador es incrementada en 1 cada que los enunciados entre llaves son ejecutados, eventualmente se alcanzar el valor de 6. En este punto los enunciados no se ejecutarn mas porque contador ya no es menor que 6 finalizando as el bucle. El programa continuar entonces con los enunciados que siguen a las llaves. La expresin de comparacin entre parntesis de la instruccin while la trataremos en el siguiente captulo, antes debemos hacer algunas observaciones respecto al bucle. Primero, si la variable contador fuera inicializada a un valor mayor de 5, los enunciados dentro de las llaves podran no ejecutarse por lo que es posible tener un bucle que jams se ejecute. Segundo, si la variable no se incrementa dentro del bucle este jams terminara y por ende el programa. Finalmente, en el caso de existir un solo enunciado por ejecutar entonces no es necesario el uso de llaves. A partir de este programa veremos el resultado

de la ejecucin del mismo en forma de comentarios y en algunas veces mostraremos imgenes del programa ejecutado al final del cdigo. Tambin continuaremos ignorando el significado de los enunciados #include y return ya que se explicarn posteriormente. EL BUCLE do-while Tenemos ahora una variacin del bucle while en nuestro siguiente ejemplo, este programa es casi idntico al ejemplo anterior excepto que el bucle inicia con la palabra clave do, seguida por una serie de enunciados compuestos entre llaves, despus viene la palabra clave while y finalmente la expresin de evaluacin entre parntesis. /* Este es un ejemplo del bucle do-while */ # include <stdio.h> int main() { int i; i = 0; do { printf ( "El valor de i es ahora %d\n", i ); i = i + 1; } while (i < 5); return 0;

Los enunciados entre llaves se ejecutan repetidamente en tanto que la expresin entre parntesis sea verdadera. Cuando la expresin es falsa, la ejecucin del bucle termina y el control del programa pasa a los enunciados siguientes. Respecto al bucle do-while debemos apuntar lo siguiente. En primer lugar, debido a que la prueba verdadero-falso se hace al final del bucle, los enunciados dentro de las llaves se ejecutan al menos una vez. En segundo, si la variable i no cambia dentro del bucle entonces el programa jams terminara. Observe adems que los bucles pueden anidarse, esto es, un bucle puede contener dentro de sus enunciados otro bucle. El nivel de anidamiento no tiene lmite y esto lo ilustraremos mas adelante. EL BUCLE for /* Este es un ejemplo del bucle for */ #include <stdio.h> int main() { int indice; for(indice = 0 ; indice < 6 ; indice = indice + 1) printf ( "El valor de indice es %d\n", indice); return 0;

} /* Resultado de la ejecucin: El valor de indice es 0 El valor de indice es 1 El valor de indice es 2 El valor de indice es 3 El valor de indice es 4 El valor de indice es 5 */ El bucle for consiste de la palabra clave for seguida de una expresin entre parntesis. Esta expresin se compone realmente de tres campos cada uno separado por un punto y coma. El primer campo contiene la expresin "indice = 0" y se le llama campo de inicializacin. Cualquier expresin en este campo se ejecuta antes del inicio del bucle, en trminos generales se puede decir que no existe lmite en el contenido del primer campo ya que es posible contener varios enunciados separados por comas sin embargo es buena prctica de programacin mantener las cosas simples. El segundo campo, que en este caso contiene "indice < 6 " es la prueba que se hace al principio de cada ciclo del bucle y puede ser cualquier expresin que pueda evaluarse a verdadero falso. La expresin del tercer campo se ejecuta en cada ciclo del bucle pero solo hasta que se hayan ejecutado todas las instrucciones contenidas dentro del cuerpo principal del bucle, en este campo, como en el primero es posible contener varias expresiones separadas por comas. En seguida de la expresin for ( ) estn uno o varios enunciados que conforman el cuerpo ejecutable del bucle. Un enunciado compuesto es cualquier grupo de instrucciones vlidas en C encerradas entre llaves. Un bucle while es til cuando se desconoce cuantas veces ser ejecutado un bucle, en tanto que la instruccin for se usa generalmente en aquellos casos en donde debe existir un nmero fijo de interacciones, adems, el bucle for es conveniente porque contiene toda la informacin del control del bucle en un solo lugar, dentro de un parntesis. Es de su eleccin utilizar uno u otro bucle y dependiendo de cmo sean utilizados cabe la posibilidad con cada uno de estos bucles de no ejecutar las instrucciones dentro del cuerpo del bucle, esto es porque la prueba se hace al principio del bucle y en la primera interaccin puede fallar, sin embargo con la instruccin do-while tenemos la seguridad de ejecutar el cuerpo del bucle al menos una sola vez porque la prueba en este bucle se hace al final del ciclo. Sentencia break. Break .

Se usa para romper una sentencia while, do-while, for o switch. Si se ejecuta se sale del bucle ms interno o de la sentencia switch que se est ejecutando. char color; switch (color) { case 'a': case 'A': printf("AMARILLO\n"); break; case 'r': case 'R': printf("ROJO\n"); case 'b': case 'B': printf("BLANCO\n"); default: printf("OTRO\n"); } La sentencia break se utiliza para terminar la ejecucin de bucles o salir de una sentencia switch. Es necesaria en la sentencia switch para transferir el control fuera de la misma. En caso de bucles anidados, el control se transfiere fuera de la sentencia ms interna en la que se encuentre, pero no fuera de las externas. mbito de la variable: Respecto al mbito de una variable, ste puede ser:
y

Local: Cuando la misma slo es accesible desde un nico procedimiento hijo, no pudiendo ser leda o modificada desde otro procedimiento hermano o desde el propio procedimiento padre. Es posible declarar variables en bloques de condicin, bucles, etc de tal modo que slo pueda accederse a ellas en el propio bloque. Global: Cuando la misma es accesible tanto desde rutinas o macros de la aplicacin, como en todos los procedimientos y funciones de la misma.

Si bien es cierto, que de una forma bsica, se puede definir el mbito de las variables de la forma expuesta ms arriba, existen grados de globalidad de las mismas, pudiendo ser accesibles desde unos puntos u otros, o incluso pudiendo ser accesibles entre aplicaciones distintas, llegando al caso de la superglobalidad. Ejemplo del mbito de una variable en el lenguaje de programacin Java.

public class A { public Integer numeroEntero = new Integer(); /* Variable Global a todos los Mtodos */ public Integer metodo() { int num = 1; // Variable Local a metodo. Puede accederse dentro de este mtodo en cualquier parte, pero no fuera del mismo. for (int i = 0;i<numeroEntero.intValue();i++) { // i es local al bucle for, slo puede ser accedida dentro del mismo. num *= i; } // i = 2; Esta lnea provocara error al no haber declarado la variable i. i fue definida localmente al bucle for. return Integer.valueOf(num); } public void otroMetodo() { int num = 1; // Variable local a otroMetodo. num aqu es una variable distinta a la variable num de metodo System.out.println("Variable local num: " + num); } } Hay que tener en cuenta que en Java el caso de las variables globales a todos los mtodos que se encuentran en una clase, es algo peculiar, ya que estas realmente son atributos que definen un objeto de una clase determinada, en este caso la clase A tiene un atributo llamado numeroEntero. El atributo es un concepto que define a un objeto de una clase determinada, mientras que una variable sirve de apoyo a los procedimientos y no define conceptualmente objetos. ARRAYS Y CADENAS Un array es una coleccin de variables del mismo tipo que se referencian por un nombre comn. A un elemento especfico de un array se accede mediante un ndice. En C todos los arrays constan de posiciones de memoria contiguas. La direccin ms baja corresponde al primer elemento y la ms alta al ltimo. Los arrays pueden tener una o varias dimensiones. El array ms comn en C es la cadena, que simplemente es un array de caracteres terminado por uno nulo. 9.1 Arrays unidimensionales Los arrays unidimensionales son listas de informacin del mismo tipo que se guardan en posiciones contiguas de memoria segn el orden del ndice. La forma general de declaracin es:tipo nombre_variable [tamao];

Los arrays tienen que declararse implcitamente para que el compilador reserve espacio en memoria para ellos. El tipo declara el tipo de los elementos del array, el tamao indica cuntos elementos mantendr el array. Para declarar un array de 10 elementos denominado p y de tipo carcter, se escribe: p y de tipo carcter, se escribe: char p[10];En este caso hemos declarado un array que tiene diez elementos, desde p[0] hasta p[9]. En C todos los arrays tienen el 0 como ndice de su primer elemento. C no comprueba los lmites de los arrays. Se puede pasar cualquier extremo de un array y escribir en alguna otra variable de datos e incluso en el cdigo del programa. 9.2 Cadenas El uso ms comn de los arrays unidimensionales es como cadenas de caracteres. En C una cadena se define como un array de caracteres que termina en un carcter nulo (\0).
y

Construir un Sitio Web Disea tu Sitio Web Gratis Editor de Web Rpido Fcil y Gratis www.Wix.com/Constructor-Sitios-WebEnlaces patrocinados

Para declarar un array de caracteres es necesario un carcter ms que la cadena ms larga que pueda contener, para dejar sitio para el carcter nulo del final de la cadena. Una constante de cadena es una lista de caracteres encerrada entre dobles comillas. Por ejemplo: "hola, que tal" No es necesario aadir explcitamente el carcter nulo al final de las constantes de cadena, el compilador lo hace automticamente. En matemticas o en programacin, una cadena de caracteres, palabra, ristra de caracteres o frase (string en ingls) es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto alfabeto. En general, una cadena de caracteres es una sucesin de caracteres (letras, nmeros u otros signos o smbolos). En matemticas es habitual usar las letras w, x, y,... para referirnos a las cadenas. Por ejemplo, si tenemos un alfabeto = a,b,c, una cadena podra ser x = aacbbcba. Desde un punto de vista de la programacin, si no se ponen restricciones al alfabeto, una cadena podr estar formada por cualquier combinacin finita de todo el juego caracteres disponibles (las letras de la 'a' a la 'z' y de la 'A' a la 'Z', los nmeros del '0' al '9', el espacio en blanco ' ', smbolos diversos '!', '@', '%', etc). En este mismo mbito (el de la programacin), se utilizan normalmente como un tipo de dato predefinido, para palabras,

frases o cualquier otra sucesin de caracteres. En este caso, se almacenan en un vector de datos, o matriz de datos de una sola fila (array en ingls). Las cadenas se pueden almacenar fsicamente:
y y

Seguidas. Enlazados letra a letra.

Generalmente son guardados un carcter a continuacin de otro por una cuestin de eficiencia de acceso. Un caso especial de cadena es la que contiene cero caracteres, a esta cadena se la llama cadena vaca; en teora de autmatas es comn denotar a la misma por medio de la letra griega En computacin las strings de C son secuencia de caracteres guardados como una matriz de caracteres terminados con un carcter nulo ('\0' o ASCII 0). El nombre se refiere al lenguaje de programacin C y se usa para distinguir esta forma de representar una cadena a cualquier otra. La caracterstica de la terminacin en nulo fue creada histricamente por problemas de seguridad relacionados con la longitud de la cadena. Si no se aade el carcter nulo al final por alguna razn el rea de memoria que sucede a la cadena ser tratada tambin como parte de la secuencia. Esto puede llevar a fallos o fugas de informacin interna del programa a atacantes o usuarios noveles. Estos errores pueden, y deben, ser prevenidos mediante comprobaciones adecuadas de errores. En el lenguaje de programacin C++ las cadenas de C se usan conjuntamente con otra representacin de secuencias de caracteres. La Standard Template Library (STL) de C++ dispone de un contenedor denominado std::string. Hay que tener en cuenta la diferencia que existe entre las cadenas tradicionales de C y las cadenas de C++, mucho ms avanzadas.

9.3 Arrays multidimensionales C permite arrays de ms de una dimensin. La forma general de declaracin de un array multidimensional es: Tipo nombre [a] [b] [c] .. [z];

Los arrays de tres o ms dimensiones no se utilizan a menudo por la cantidad de memoria que se requiere para almacenarlos, ya que el almacenamiento requerido aumenta exponencialmente con el nmero de dimensiones.9.4 Inicializacin de arrays C permite la inicializacin de arrays en el momento de declararlos, como en cualquier variable. La forma general es: tipo nombre [tamao1] [tamao n]={lista de valores}; la lista de valores es una lista de constantes separadas por comas cuyo tipo es compatible con el tipo especificado en la declaracin del array. Por ejemplo: int i[10] = {1,2,3,4,5,6,7,8,9,10}; Con las cadenas o arrays de caracteres se hace igual, aunque permite una inicializacin abreviada. Estas dos sentencias producen el mismo resultado: char cad[11] = "Me gusta C"; char cad[11] = { }; Los arrays multidimensionales se inicializan del mismo modo que los unidimensionales.

Conclusin: Las sentencias al pasar el tiempo han sido mejoradas y aadidas nuevas funciones dentro del lenguaje c lo que da ms amplitud al momento de disear un programa, algunas de la condiciones que se deben cumplir o no en el programa del cdigo netamente hablando y existen varias herramientas y guas que explican cada una de las funciones bsicas del lenguaje c como esta antes mencionado en el desarrollo de varias sentencias, lneas de cdigos, funciones, etc.

S-ar putea să vă placă și