4. ELEMENTOS DE UN PROGRAMA C. 3
4.6 Modificadores de almacenamiento. 4
4.12 Conversiones explícitas. 8
7. DIRECTRICES DEL PROCESADOR. 11
7.3 #if #else #elif #endif. 12
8.1 Funciones de entrada de datos. 12
8.2 Funciones de salida de datos. 13
8.3 Funciones de conversión de datos. 14
9.3 Utilidades para la gestión de proyectos. 15
1. INTRODUCCIÓN
· El lenguaje C se puede considerar como una alternativa al lenguaje ensamblador más que un lenguaje de alto nivel.
· Esto se debe a sus especiales características. C es un lenguaje que ofrece recursos análogos a los de un ensamblador, permitiendo accesos y operaciones que por lo general no son posibles con lenguajes de alto nivel, ya que éstos están definidos hacia tareas concretas, gestión, cálculo matemático, etc., mientras que C es un lenguaje diseñado para la creación de herramientas
2. HISTORIA
· La historia del lenguaje C está íntimamente ligada al desarrollo del sistema operativo Unix.
· C fue creado por Dennis Ritchie con la colaboración de Kernigham a partir de un lenguaje creado por Ken Thompson y que denominó lenguaje B.
· El lenguaje C fue implementado en un minicomputador PDP-11 a principio de los años 70.
· En 1983 ANSI estableció un comité con el objeto de normalizar este lenguaje. Un programa en ANSI C puede ser portable entre diferentes plataformas.
3. CARACTERÍSTICAS
· Hay que destacar que podemos encontrar S.Os, procesadores de texto, hojas de cálculo, programas de comunicaciones.. diseñador íntegramente en C.
· Es un lenguaje de nivel medio. Aunque tiene características de alto nivel también algunas características de bajo nivel.
· Sensibilidad a mayúsculas (se distingue entre MAYUS y minus)
· Hay que tener cuidado (no es lo mismo printf que Printf)
· No existe comprobación de tipos à compilación y ejecución más rápidas.
· Tiene un número pequeño de palabras reservadas frente a otros lenguajes.
· Muchas librerías definidas en este lenguaje.
4. ELEMENTOS DE UN PROGRAMA C
Pequeño programa en C.
/* Programa: suma.c
*Descripción: este programa efectúa la suma de 2 enteros */
#include <stdio.h>
Int suma (int a, int b)
{
Int res;
Res= a+b;
Return res;
}
Void main()
{
Int x,y,z;
X=5;
Y=10;
Z= suma (x,y);
Printf(“El resultado es: %d”,z);
}
Algunos de estos elementos:
– Comentarios: /* y */ el compilador ignora todo lo que este entre ellos.
– Directrices: van precedidas de #
– Variables: almacenan datos y se distinguen por un identificador compuesto por letras y códigos.
– Funciones: toman parámetros de entrada y devuelven un valor. Son un subprograma.
– Función main: función principal e indica el punto de entrada del programa asi como el punto de salida. Podemos tener definidas otras funciones y llamarlas desde aquí.
Elementos del lenguaje:
4.1 Identificadores
Referencian variables, funciones y objetos definidos por el usuario.
Identificador válido: numero1, suma, potencia
Identificador no válido: 1er número, 2324
4.2 Tipos de datos
Existen palabras clave para definir diferentes tipos.
4.3 Tipos básicos
Son los tipos elementales no compuestos, incluidos en la mayoría de los lenguajes:
-char – int – float – doublé
4.4 Modificadores de tipo
– Signed: con signo
– Unsigned: sin signo
– Long: largo
– Short: corto
Es posible combinarlos con tipo básicos:
Unsigned int
Long int
4.5 Variables
Representa un valor que puede variar a lo largo de la ejecución. Necesitamos un tipo y un identificadorà int número
4.5.1 Variables globales
Accesibles desde cualquier función del programa y se declaran al principio del programa.
4.5.2 Variables locales
Se definen dentro de una función. Solo son accesibles dentro de la función en la que están definidas. Se crean al entrar en la función y se destruyen al salir.
4.6 Modificadores de almacenamiento
Se utilizan para modificar el modo de almacenamiento de las variables.
4.6.1 Static
Tiene una existencia permanente. Su valor permanece entre llamada y llamada.
Int incrementa () {
Static int cont= 0;
Cont ++;
}
4.6.2 Register
Estas variables serán almacenadas en registros de la CPU.
4.7 Literales
Representan valores explícitos y pueden tomar diferentes tipos.
4.7.1 Literales carácter
Se encierra entre comillas simples à char tecla= ‘s’ ;
4.7.2 Literales carácter de barra invertida
\n Nueva línea
\t Tab horizontal
\v Tab vertical (sólo para impresora)
\b Backspace (retroceso)
\r Retorno de carro
\f Alimentación de página (sólo para impresora)
\a Bell (alerta, pitido)
\’ Comilla simple
\” Comilla doble
\\ Backslash (barra invertida)
\ddd Carácter ASCII. Representación octal
\xdd Carácter ASCII. Representación hexadecimal
4.7.3 Literales enteros
Es un conjunto de números sin parte decimal. à int n =587;
4.7.4 Literal real
Conjunto de números con parte decimal y exponente. à float pi: 3.1416;
4.7.5 Literal cadena
Conjunto de caracteres encerrado entre comillas dobles. à printf (“Hola mundo”)
4.8 Operadores
Se utilizan para formar expresiones y pueden ser clasificados, según su funcionalidad, en aritméticos, relacionales, lógicos…
4.8.1 Operadores aritméticos
Se utilizan para formar expresiones aritméticas cuyo resultado será un número entero o real.
Operador |
Significado |
+ |
Suma |
– |
Resta |
* |
Producto |
/ |
División |
% |
Resto división entera |
++ |
Incremento |
— |
Decremento |
4.8.2 Operadores relacionales
Se comparan dos expresiones de un mismo tipo.
Operador Operación
< Primer operando “menor que” el segundo
> Primer operando “mayor que” el segundo
<= Primer operando “menor o igual que” el segundo
>= Primer operando “mayor o igual que” el segundo
== Primer operando “igual que” el segundo
!= Primer operando “distinto que” el segundo
4.8.3 Operadores lógicos
Estos operadores producen un resultado entero que es interpretado como valor lógico.
Operador |
Significado |
&& |
AND |
|| |
Or |
! |
Not |
4.8.4 Operadores de asignación
= Asignación simple
*= Multiplicación más asignación
/= División más asignación
%= Módulo más asignación
+= Suma más asignación
-= Resta más asignación
<<= Desplazamiento a izquierdas más asignación
>>= Desplazamiento a derechas más asignación
&= Operación AND sobre bits más asignación
|= Operación OR sobre bits más asignación
^= Operación XOR sobre bits más asignación
4.8.5 Operadores sobre bits
& Operación AND al nivel de bits
| Operación OR al nivel de bits (ASCII 124)
^ Operación XOR al nivel de bits
<< Desplazamiento a la izquierda
>> Desplazamiento a la derecha
~ Not
4.8.6 Operador condicional
Este lenguaje cuenta con un operador ternario con la siguiente sintaxis.
Condición ¿exp1: exp2;
Evalúa la condición y, en caso de cumplirse, devuelve como resultado la expresión tras
El signo ¿, si no, devuelve el resultado tras el signo : .
4.9 Precedencia
Indica el orden en el que serán evaluados los operadores en una expresión de forma que se evalúan en primer lugar los más prioritarios.
4.10 Asociatividad
Indica el sentido en el que son evaluados los operadores. 2 alternativas:
o Evaluarlos de izq a dcha (2-2-2=0-2=-2)
o Evaluarlos de dcha a izq (2-2-2=2-0=2)
4.11 Conversión de tipos
Si en una expresión aparecen operandos con diferente tipo, para ser evaluados, es necesario efectuar una conversión de tipo.
Ejemploà
Float pi = 3.1416
Float x ;
X= pi+2;
En este caso cambiamos el tipo del segundo operador, convirtiéndolo en real, tras lo cual, se efectúa la suma.
4.12 Conversiones explícitas
Se puede convertir el resultado de un operador o expresión a un tipo si se antepone dicho tipo encerrado entre paréntesis. (cast)
Si hacemos 5/2 à 2, porque se hace una división entera.
Si hacemos x=(float) 5/2; à x= 2.5
5. SENTENCIAS DE CONTROL
Permiten cambiar el flujo del programa.
5.1 Selección
Alteran el flujo del programa en función del valor de una expresión.
5.1.1 Sentencia if
Ejecuta una sentencia si se cumple una condición.
If (n>=5)
Printf(“\nAprobado”);
5.1.2 Sentencia if else
Las sentencias que siguen se ejecutarán en caso de no cumplirse la condición.
if(condición)
Sentencia1;
else
Sentencia2;
5.1.3 Sentencia if else encadenada
Son evaluadas varias condiciones. El último if contiene la sentencia a ejecutar en caso de que no se cumpla ninguna condición.
if(condición)
Sentencia1;
Elseif(cond2)
Sentencia2;
…
Elseif (condN)
sentencian;
else
sentencia;
5.1.4 Sentencia switch
Desvía el flujo del programa en función del valor que tome una expresión. Cada caso ejecuta las sentencias que se encuentra por debajo hasta encontrar un break.
Switch(var) {
Case 1: sentencias; break;
…
Case n: sentencias; break;
Default: sentencias; break;
}
5.2 Bucles
Ejecutan un conjunto de sentencias repetidas veces.
5.2.1 Sentencia for
Se utiliza cuando conocemos el número de vueltas del bucle. Pero en C, el bucle continuará ejecutándose en función de una condición.
For(inic; cond; incr)
Sentencias;
For (i=0; i<10; i++)
Printf(“\n Numero : %d”,i);
5.2.2 Sentencia while
Hemos de especificar una condición. El bucle se ejecutará mientras se cumpla dicha condición.
While (cond)
Sentencias;
Ejemplo:
While (tecla != ‘s’)
{
Printf(“\nPulsa la tecla s “);
Tecla= getch();
}
5.2.3 Sentencia o while
La condición se evalúa tras ejecutar las instrucciones que componen el bucle.
Do
Sentencias;
While(cond);
5.3 Saltos
Se utilizan para alterar el flujo del programa de manera incondicional, saltando hacia un lugar diferente.
5.3.1 Break
Termina la ejecución de la estructura de control en la que se encuentra, continuando con la siguiente sentencia tras dicha estructura de control.
5.3.2 Continue
Va al inicio de un bucle saltando todas las secuencias que se encuentran tras ella.
5.3.3 Goto
Es una palabra en desuso (provoca código difícil de entender)
Es un salto incondicional a un punto definido del programa.
Etiqueta: Sentencia1
Sentencia2
…
SentenciaN
Goto Etiqueta;
6. FUNCIONES
Es un programa constituido por un conjunto de instrucciones y datos que puede ser llamado desde un punto del programa.
6.1 Prototipos
Debemos saber que una función debe estar definida para ser utilizada. Si colocamos en primer lugar una función llamada main, y desde esta hacemos una llamada a una función que se encuentra definida debajo, provocará un error de compilación.
Por eso usamos la directiva #include en la cabecera junto con los ficheros de cabecera, puesto que en estos ficheros viene incluido el prototipo de las funciones de librería que emplearemos en nuestros programas.
6.2 Definición
Incluiremos el código y datos de la función, es decir, la implementamos.
Ejemplo:
Int suma (int a, int b)
{
Int res;
Res= a+b;
Return res;
}
6.3 Llamada a funciones
Se efectúa mediante el identificador de dicha función, incluyendo los parámetros.
Ejemplo:
Void main(){
…
X=suma (5,4);
…}
6.4 Parámetros
Datos que pasamos a la función durante el proceso de llamada.
o Parámetros formales: indicados en el prototipo de la función.
o Parámetros reales: Datos que pasamos a la función en la llamada.
6.4.1 Paso de parámetros por valor
El compilador pasa una copia de los parámetros reales sobre los formales. Un cambio en el contenido de los parámetros formales no afecta a los parámetros reales, solo se modifica la copia.
6.4.2 Paso de parámetros por referencia
No se pasa una copia, sino, la dirección de los parámetros reales. Un cambio en su contenido afecta a los parámetros reales (puntero* y dirección &)
6.5 Funciones recursivas
Es una función que se llama a sí misma. (ejemplo del factorial)
7. DIRECTRICES DEL PROCESADOR
Son procesadas por el preprocesador C antes de la fase de compilación, alternando el contenido de los ficheros a compilar.
7.1 #include
Incluye el contenido de ficheros de cabecera, de manera que podemos usar las funciones, constantes y definiciones incluidas en dichos ficheros.
Ficheros de cabecera más usuales:
Fichero |
Propósito |
Stdio.h |
Entrada y salida de datos |
Conio.h |
Entrada y salida por consola |
Math.h |
Funciones matemáticas |
String.h |
Manipulación de cadenas |
Time.h |
Funciones de fecha y hora |
Malloc.h |
Asignación de memoria |
Signal.h |
Señales |
7.2 #define
Permite definir macros, serán sustituidas por el valor indicado antes de ser compilado el código fuente.
Ejemplo:
#define PI 3.1416
7.3 #if #else #elif #endif
Permite la compilación condicional, de manera que, si se cumple la condición especificada el código indicado, será compilado, y, en caso contrario, no será compilado.
7.4 #ifdef #ifndef
El preprocesador comprueba sin un símbolo está definido o no.
8. FUNCIONES DE LIBRERÍA
Incluyen un amplio repertorio de funciones de librería.
8.1 Funciones de entrada de datos
Utilizada para la entrada de datos que serán retornados por la función, de manera que podemos asignárselo a una variable.
Carácter
Prototipo |
Descripción |
Int getc(); |
Devuelve un carácter leído desde teclado. |
Int getchar(); |
Lee un carácter, pero, en este caso debemos pulsar enter. |
Int getche(); |
Lee un carácter haciendo eco en pantalla |
Cadena
Prototipo |
Descripción |
Char * gets(char * cad); |
Lee una cadena de caracteres desde teclado |
Formateada
Prototipo |
Descripción |
Scan(char* cadenaformato, params…) |
Le pasamos una cadena de formato indicándole el formato de la entrada y una lista de variables que contendrán estos datos. |
Códigos de formato:
8.2 Funciones de salida de datos
Utilizada para la salida de datos, que serán mostrados por consola.
Carácter
Prototipo |
Descripción |
Putc(int c) |
Muestra en pantalla un carácter |
Cadena
Prototipo |
Descripción |
Puts(char * cad) |
Muestra una cadena de caracteres. |
Formateada
Prototipo |
Descripción |
Printf(char*cadenaformato, params…) |
Le pasamos una cadena de formato indicándole el formato de salida y una lista de variables que contendrán estos datos. |
8.3 Funciones de conversión de datos
Prototipo |
Descripción |
Int abs(int n); |
Calcula el valor absoluto de un entero. |
Double atof(const char * string), int atoi(const char * string); |
Convierten una cadena en número real y entero respectivamente. |
Char *itoa (int value, char * string, int radix); |
Convierte un entero en cadena. |
Double strtod (const char * nptr, char** endptr); |
Convierte una cadena en real de doble precisión. |
Int tolower(int c); |
Convierte un carácter en minúsculas. |
Int toupper(int c); |
Convierte a mayúsculas. |
8.4 Funciones matemáticas
sqr sqr(x)=x*x
sqrt sqrt(x)=raíz cuadrada de x
raíz sqrt(x)=raíz cuadrada de x
exp exp(x)=exponencial natural de x=e^x
log log(x)=logaritmo natural de x
log10 log10(x)=logaritmo base 10 de x
abs abs(x)=valor absoluto de x
ent ent(x)=mayor entero n tal que n<x
sgn sgn(x)=signo de x (1 si x>0,-1 si x<0,0 si x=0)
ind ind(b)=indicadora de b (1 si b=true, 0 si b=false)
sin sin(x)=seno de x
sen sen(x)=seno de x
cos cos(x)=coseno de x
tan tan(x)=tangente de x
cot cot(x)=cotangente de x
sec sec(x)=secante de x
csc csc(x)=cosecante de x
sinh sinh(x)=seno hiperbólico de x=(exp(x)-exp(-x))/2
senh senh(x)=seno hiperbólico de x=(exp(x)-exp(-x))/2
cosh cosh(x)=coseno hiperbólico de x=(exp(x)+exp(-x))/2
tanh tanh(x)=tangente hiperbólica de x=sinh(x)/cosh(x)
coth cot(x)=cotangente hiperbólica de x=cosh(x)/sinh(x)
sech sech(x)=secante hiperbólica de x=1/cosh(x)
csch csch(x)=cosecante hiperbólica de x=1/senh(x)
asin asin(x)=ángulo cuyo seno es x
asen asen(x)=ángulo cuyo seno es x
acos acos(x)=ángulo cuyo coseno es x
atan atan(x)=ángulo cuyo coseno es x
9. ENTORNO DE COMPILACIÓN. HERRAMIENTAS PARA LA ELABORACIÓN Y DEPURACIÓN DE PROGRAMAS EN LENGUAJE C.
Entornos de trabajo que incluyen multitud de herramientas que facilitan el trabajo al programador. Incluye:
– Editor
– Compilador
– Enlazador
– Depurador
9.1 Editor
Permite la edición de ficheros que contienen el código fuente. (uso de colores, indentación, comentarios, operadores…)
Incluye las siguientes funciones:
– Abrir, guardar, guardar como
– Seleccionar, cortar, copiar, borrar, buscar, reemplazar
– Tabuladores, Indentación, colores
9.2 Compilador
Transforma los ficheros fuentes en código ejecutable.
Como mínimo indicaremos la lista de ficheros a compilar, las librerías que usaremos y el fichero de salida.
Dispondrá de las siguientes opciones:
– Opciones de depuración: Parámetro que indica al compilador que el fichero ejecutable debe incluir información para ser depurado.
– Optimización de código: Hacen más eficiente la ejecución de los programas obtenidos.
– Generación de avisos: Tiene opciones para indicar el nivel de avisos que vamos a utilizar. (warnings)
9.3 Utilidades para la gestión de proyectos
Herramienta que nos facilita la compilación de estos grandes ficheros, de modo que solo serán compilados aquellos ficheros que sean necesarios.
9.4 Depuradores
Nos permite ejecutar un programa de manera controlada, para localizar posibles errores para su posterior reparación.
Un depurador puede contar con las siguientes opciones:
– Ejecutar à ejecuta un programa hasta el punto de interrupción.
– Paso a paso à ejecuta un programa paso a paso.
– Ejecutar hasta el cursor à ejecuta hasta el punto en el que situemos el cursor.
– Ver llamadas à Se nos permite ver la pila de llamadas.
– Punto de ruptura à permite ver, poner y quitar puntos de ruptura.
– Variable à Permite ver/establecer el valor de las variables.