LENGUAJE DE PROGRAMCION EN C


Contar con un lenguaje de alto nivel permitió el avance de los sistemas operativos, ya que El lenguaje de programación C fue creado por Dennis Ritchie entre 1969 y 1973 cuando trabajaba en Bell Laboratories de AT&T junto con Ken Thompson en el diseño del sistema operativo UNIX. C fue creado para poder escribir dicho sistema operativo en un lenguaje de alto nivel, independiente del hardware donde se ejecutara.
el mismo código podía ser utilizado en las distintas plataformas, propiciando la reutilización de código y reduciendo los tiempos de desarrollo. Así es que los sistemas operativos basados en UNIX, el sistema BSD, el sistema GNU/Linux y muchos otros fueron desarrollados en C.
Además, con el paso del tiempo se han desarrollado cientos de bibliotecas que permiten a los programadores de C utilizar el código desarrollado por otros para la realización de tareas comunes. Esto, a su vez, ha propiciado el desarrollo de aplicaciones en lenguaje C.
Actualmente es imposible contar la cantidad de aplicaciones y herramientas desarrolladas en C.

DEFINICION.


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.

Evolucion


A mediados de los años 60s, Martin Richards diseñó el lenguaje BCPL con la finalidad de usarlo para escribir software de sistemas operativos y compiladores.
En 1969, Ken Thompson escribió el Lenguaje B, en Bell Laboratories, con el objetivo de recodificar UNIX (escrito hasta ese momento en lenguaje ensamblador) usando un lenguaje de alto nivel más portable y flexible.
Durante los siguientes años, Dennis Ritchie modificó el lenguaje B, llegando a crear el lenguaje C y reescribiendo el sistema UNIX en dicho lenguaje; añadió características nuevas, como son el diseño de tipos y las estructuras de datos.
En 1978, Dennis Ritchie y Brian Kernighan publicaron la primera edición del libro El lenguaje de programación C. Este libro fue durante años la especificación informal del lenguaje. El lenguaje descrito en la primera edición de este libro, fue conocido como "el C de Kernighan y Ritchie" o simplemente "K&R C". En este libro se introdujeron nuevas características al lenguaje: los tipo de datos struct, long int y unsigned int; los operadores =+ y =- fueron sustituidos por += y -=.
A mediados de los años 80, Bjarne Stroustrup (también de los laboratorios Bell), crea el lenguaje C++, un lenguaje basado en C, con numerosas características adicionales, siendo la principial que está orientado a objetos. Si bien se han creado muchos lenguajes basados en C, C++ es el que ha permanecido más asociado a C.
En los años siguientes a la publicación del C de Kernighan y Ritchie, se añadieron al lenguaje muchas características no oficiales, que estaban presentes en algunos compiladores y no en otros. Fue por ello que en 1989 ANSI (American National Standards Institute) publicó el primer estándar oficial de C, que es conocido como ANSI C.
En este estándar se tomaron muchas de las funcionalidades no oficiales y se agregaron funcionalidades nuevas como los prototipos de función, y un preprocesador mejorado. También se cambió la sintaxis de la declaración de parámetros de funciones, para que incluyeran el tipo junto con el nombre.
Al año siguiente, en 1990 se publicó la estandarización ISO del lenguaje. Este estándar es básicamente el estándar ANSI, con unas pocas modificaciones de formato. A este estándar se lo conoce, entonces, como C89, o C90, y se trata del mismo lenguaje.
Basándose en el estándar ANSI que estaba en preparación, en 1988 Kernighan y Ritchie publicaron la segunda edición de su libro, que es aún hoy utilizada como una de las referencias principales del lenguaje.

TIPOS DE DATOS




Los tipos de datos son enteros, flotantes, caracteres.
Enteros.
Los enteros son el tipo de dato más primitivo en C. Se usan para representar números enteros. Pero siempre se pueden encontrar otras aplicaciones para los números enteros. En general se pueden usar para representar cualquier variable discreta.
Los tipos de datos enteros son: short, int, long y long long.
Es decir que para el lenguaje C existen diferentes tamaños de números enteros que, según el compilador y la plataforma de hardware, pueden tener desde 1 byte hasta 8 bytes (para más detalles busca en la referencia).
Además, el lenguaje C hace la distinción de si el entero es con signo o sin signo (signed o unsigned). La forma de declarar un entero es con uno de los tipos de datos que sean enteros según el tamaño que se quiera. En caso de que no se declare si es con signo o sin signo, se toma con signo.
Algunos ejemplos de declaraciones de enteros:
int a;
unsigned int a;
signed long a;
signed long long a = 10000000; marco chuma alvarez
Todos los números son representados en memoria mediante una cadena de bits. En el caso de los números con signo, el bit más significativo es el que se usa para representar el signo. La representación de los números negativos se realiza mediante el complemento a dos, que es una técnica que permite operar con los números negativos de forma lógica.
Flotantes.
Se denomina flotantes a los tipos de datos que representan a los números reales, ya que utilizan un sistema de representación basado en la técnica de coma flotante, que permite operar con números reales de diversas magnitudes, mediante un número decimal llamado mantisa y un exponente que indica el orden de magnitud.
El tipo de dato flotante en lenguaje C sólo tiene dos tamaños: el float y el double, que son 4 bytes y 8 bytes respectivamente. Se los puede utilizar tanto para representar números decimales, como para representar números enteros con un orden de magnitud muy grande.
La forma de declarar una variable flotante es escribiendo en una línea uno de los tipos de datos flotantes y a continuación el nombre de la variable y tal vez algún valor que se les quiera dar.
Algunos ejemplos:
float a;
double a = 1e23;
double a = 3.1416;
float a = 4e-9;
double a = -78;
Hay que tener en cuenta que aunque los valores flotantes son más convenientes para algunas aplicaciones, hay casos en los que se prefieren los enteros. Esto se debe a que los números flotantes no necesariamente tienen soporte de hardware, en particular en las plataformas integradas. Una alternativa que se utiliza en estas situaciones es interpretar los enteros como decimales de forma que 150 se interprete como 1.5 y 2345 como 23.45.
Para el caso de los flotantes de 4 bytes, se utiliza 1 bit para el signo, 8 bits para el exponente y 23 bits para el valor del número. El procedimiento para almacenar un número en una variable flotante es el siguiente:
Se convierte a binario la parte entera.
Se coloca el signo en el bit más significativo de la misma manera que en los enteros (1 para el - y 0 para el +).
Se mueve la coma (en la representación binaria de la parte entera) hasta que esté a la derecha del primer uno y éste se descarta (el uno más significativo). El valor del exponente será el número de posiciones que se movió la coma. El exponente usa la representación de un entero con complemento a dos.
Se convierte en binario la parte decimal del número. Esto usando el peso de los bits. el bit decimal más significativo vale 1/2, el siguiente vale 1/4, el otro 1/8, el otro 1/16 y así hasta completar lo que falta para los 23bits del valor.
Se concatena todo y ese es el valor flotante representado en memoria.
Caracteres.
Los caracteres se representan utilizando el tipo char, que tiene sólo 1 byte de tamaño. Este tipo se utiliza para representar los 255 caracteres de la tabla de caracteres del sistema. El tipo char es también un tipo entero, ya que puede tomar valores de 0 a 255.
En cuanto a la forma de declarar variables de tipo char es la misma forma que con los otros tipos. char a; char a = 's'; char a = 48;
Como puedes ver, se le puede asignar un número a una variable char, ya que se trata de un tipo entero. En algunas situaciones particulares se utiliza el tipo char para contadores, porque permite que ocupen sólo un byte en memoria.
Es importante notar que con la llegada de la codificación UTF-8, los caracteres de los diversos idiomas pueden ocupar 1, 2, 3 o 4 bytes, de modo que el tipo char ya no alcanza para la representación de todos los caracteres. Por ello, el estándar C99 introduce el tipo wchar que puede ocupar más de 1 byte, según sea necesario para la codificación utilizada por el sistema.

Librerias

El estándar ANSI C define un conjunto de funciones, así como tipos relacionados y macros, que son proporcionados para la implementación. Todas las librerías son declaradas en un fichero cabecera. Para que sea visible al programa, se añade el comando del preprocesador #include. Por ejemplo: #include ;
Cada fichero de cabecera se denomina librería. En la siguiente lista mostraremos la Librería junto con la Descripción:assert.h Contiene una macro para el diagnóstico dentro de los programas.ctype.h Contiene varias funciones para comprobación de tipos y transformación de caracteres.errno.h Contiene varias macros usadas para informar de errores.limits.h Contienen varias macros que definen constantes para el tamaño de tipo enteros.float.h Contienen varias macros que definen constantes para el tamaño de tipo flotante.locale.h Contienen varias macros, funciones y tipos para unidades locales, como unidad monetaria, tiempo, dígitos, etc.math.h Contiene una macro y varias funciones matemáticas.setjmp.h Contienen declaraciones que proporcionan una forma de evitar la secuencia normal de llamada y regreso de funciones.signal.h Contiene un tipo, dos funciones y varias macros para manejar condiciones excepcionales que aparecen durante la ejecución, tal como una señal de interrupción de una fuente externa o un error en la ejecución.stdarg.h Contiene un tipo y tres macros que proporcionan recursos para recorrer una lista de argumentos de función de tamaño y tipo desconocido.stddef.h Contiene varios tipos y macros que también están definidas en otras librerías, como size_t.stdio.h Contiene tipos, macros y funciones para la realización de tareas de E/S.stdlib.h Contiene tipos, macros y funciones para la conversión numérica, generación de números aleatorios, búsquedas y ordenación, gestión de memoria y tareas similares.string.h Contiene tipos, macros y funciones para la manipulación de cadenas de caracteres.time.h Contiene tipos, macros y funciones para la la manipulación de información sobre fechas y horas.

INSTRUCCIONES DE CONTROL



La estructura condicional if ... else
En la gran mayoría de los programas será necesario tomar decisiones sobre qué acciones realizar. Esas decisiones pueden depender de los datos que introduzca el usuario, de si se ha producido algún error o de cualquier otra cosa.
La estructura condicional if ... else es la que nos permite tomar ese tipo de decisiones. Traducida literalmente del inglés, se la podría llamar la estructura "si...si no", es decir, "si se cumple la condición, haz esto, y si no, haz esto otro".
Un ejemplo sencillo sería el siguiente (no se trata de un programa completo, sino tan sólo una porción de código): if (edad <>
La estructura condicional switch ... case
La estructura condicional switch ... case se utiliza cuando queremos evitarnos las llamadas escaleras de decisiones. La estructura if nos puede proporcionar, únicamente, dos resultados, uno para verdadero y otro para falso. Una estructura switch ... case, por su parte, nos permite elegir entre muchas opciones:ejemplo con un salario con ola condicion switch/*si*/#include#includemain(){ int nivel; float salario, slanuevo; printf("introduce tu nivel\n"); scanf("%d",&nivel); printf("dame tu salario\n "); scanf("%f",&salario); switch (nivel) { case 1: slanuevo=salario+(salario*.035); printf("tu salario es:%f\n",slanuevo); break; case 2: slanuevo=salario+(salario*.041); printf("tu salario es:%f\n",slanuevo); break; case 3: slanuevo=salario+(salario*.048); printf("tu salario es:%f\n",slanuevo); break; case 4: slanuevo=salario+(salario*.053); printf("tu salario es:%f\n",slanuevo); break; default: printf("tu salario es:%f\n",salario);}getch();} switch (semaforo) { case 1: printf("El semáforo está verde.\n"); break; case 0: printf("El semáforo está rojo.\n"); break; case 2: printf("El semáforo está anaranjado.\n"); break; case 3: printf("El semáforo está anaranjado parpadeante.\n"); break; default: printf("ERROR:¡El semáforo no puede estar en ese estado!.\n");}
El bucle while
El bucle while sirve para ejecutar código reiteradas veces.while (/* Condición de ejecución del bucle */) { /* Código */}
La condición ha de ser una sentencia que devuelva un valor booleano, y esta puede ser el valor booleano en sí, verdadero (true o 1) si la condición se cumple, o falso si esta no se cumple (false o 0). También puede ser el nombre de una variable, y el valor de la expresión dependerá de su contenido. Aunque sea una variable no booleana, siempre se podrá usar, si vale 0 será como si la condición no se cumpliera, y siempre que sea diferente de 0, se considerará que la condición se cumple.

El bucle for
El bucle for es un bucle muy flexible y la vez muy potente ya que tiene varias formas interesantes de implementarlo, su forma más tradicional es la siguiente:for (/* inicialización */; /* sentencia condicional */; /* incremento o decremento */) { /* código a ejecutar */}
Inicialización: en esta parte se inicia la variable que controla el bucle y es la primera setencia que ejecuta el bucle, solo se ejecuta una vez ya que solo se necesita al principio del bucle.
Sentencia condicional: es la segunda sentencia que ejecuta el bucle, es una sentencia condicional válida, que determina si el bucle se ejecutará o no. incremento o decremento: es la ultima sentencia que ejecuta el bucle por lo general incrementar la variable con que se inicio el ciclo, después de eso el bucle revisa nuevamente la condición, si es verdadera tiene lugar una ejecución más del cuerpo del ciclo, si es falsa se termina el ciclo y así la repetición. Aquí muestro un ejemplo de un bucle que se ejecuta 100 veces:for (int i=0; i <>, >=; junto con otro valor; esta parte del bucle también se puede implementar con una variable de tipo bool.
NOTA: recuerde que en cualquier sentencia donde se evalúa una expresión válida, un valor de retorno=0 se considera falso y cualquier valor distinto de cero es verdadero, así false=0 y true=1.

El bucle do...while
El bucle do...while es un bucle que, por lo menos, se ejecuta una vez. While significa "mientras"
Su forma es esta:do { /* CODIGO */} while (/* Condición de ejecución del bucle */)
Os muestro un ejemplo sencillo de uso:int aleatorio;do { aleatorio = rand();} while (aleatorio != 25)
La verdad es que este ejemplo puede resultar un poco absurdo, pero es bastante intuitivo. El código del bucle asigna un valor aleatorio a la variable definida anteriormente, y mientras esa variable no tenga el valor 25, el bucle sigue ejecutándose.

El goto
La sentencia goto sirve para indicar al programa que continue ejecutándose desde la línea de código indicada. La verdad es que es una sentencia poco aceptada por la comunidad de programadores, pues puede provocar que se hagan programas un poco "sucios" y confusos.
Su sintaxis es más o menos así:/* Código */ETIQUETA:/* Código */goto ETIQUETA;/* Código */