Lengiaje C

Anuncio
REPUBLICA BOLIVARIANA DE VENEZUELA
MINISTERIO DEL PODER POPULAR
PARA LA EDUCACION SUPERIOR
INSTITUTO UNIVERSITARIO DE TECNOLOGIA
“PEDRO EMILIO COLL”
MARACAIBO-ESTADO ZULIA
LENGUAGE C
MARACAIBO, 21 de Enero de 2008
INTRODUCCION.
El lenguaje C se conoce como un lenguaje de medio nivel, pues
podríamos situarlo entre los lenguajes de bajo nivel o de máquina
(ensamblador) y los de alto nivel como el PASCAL, por ejemplo.
Un lenguaje de medio nivel nos ofrece un conjunto básico de sentencias de
control y de manipulación de datos que nos permitirá construir sentencias y
estructuras de nivel más alto.
En la actualidad existen numerosos compiladores de C, todos ellos con sus
peculiaridades, sin embargo, prácticamente todos son compatibles con el C
normalizado por ANSI, el ANSI C, en el que nos centraremos partir de ahora.
Definicion
HISTIRIA
El lenguaje C fue diseñado por Dennis Ritchie, de los Laboratorios
Bell, y se instaló en un PDP-11 en 1972.
Se diseñó para ser el lenguaje de los sistemas operativos UNIX.
Se creó para superar las limitaciones del lenguaje B, utilizado por Ken
Surgió a partir de dos lenguajes de programación de sistemas, BCPL y B.
Thompson para producir la versión original de UNIX en 1970.
El lenguaje B se basó en BCPL, lenguaje sin tipos desarrollado por
Martin Richards, en 1967, para programación de sistemas.
Su definición apareció en 1978: apéndice "C Reference Manual" del libro
"The C programming Language" de Brian W. Kernighan y Dennis M. Ritchie
(Ed. Prentice-Hall).
En 1983, se publicó otro estándar:
"The C Programming Language-Reference Manual" (Lab.Bell) escrito por
Dennis M. Ritchie
A mediados de los ochenta ya había en el mercado numerosos
compiladores C, y muchas aplicaciones habían sido reescritas a él para
aprovechar sus ventajas.
Durante este periodo de tiempo numerosos fabricantes introducen mejoras
en el lenguaje, las cuales son recogidas por un comité de estandarización
ANSI y establecen las especificaciones de lo que se conoce hoy en día como
'ANSI C'.
Estructura y fases de creación de un programa C
Un
programa
C
está
formado
exclusivamente
por
funciones
independientes. A diferencia de lenguajes como PASCAL, en C no se puede
crear una función dentro de otra función.
El código de un programa C suele distribuirse entre varios ficheros fuente
(con extensión .c), denominados módulos. Así, habitualmente un programa
de cierto tamaño constará de un módulo que contiene el programa principal
(ubicado en una función especial denominada main()), y de otros módulos
con el código de diversas funciones agrupadas según algún criterio, o con
definiciones de tipos utilizados. Además, todos los compiladores ponen a
disposición del programador una enorme cantidad de funciones, accesibles
por medio de librerías (ver sección 7.4). De hecho, si el programa es
suficientemente pequeño puede constar de un sólo módulo, el principal, que
haga uso de las librerías.
En la Figura se muestran las 4 fases en la creación de un programa
ejecutable desarrollado en el lenguaje
Características
El C se encuentra en la jerarquía de lenguajes en un nivel intermedio
entre Pascal y el Ensamblador. Pretende ser un lenguaje de alto nivel con la
versatilidad del bajo nivel.
Se diseñó junto con el sistema operativo UNIX y está muy orientado a
trabajar en su entorno.
En su desarrollo se siguieron una serie de líneas generales tales como:
El compilador debe ser lo más pequeño y eficiente posible. Pocas palabras
reservadas, esto es, un conjunto reducido de sentencias. No existe
anidamiento de procedimientos.
La entrada/salida no se considera parte del lenguaje en sí, sino que se
suministra a través de funciones de librería. La misma política se sigue con
cualquier otro tipo complejo de instrucciones.
Para escribir un programa se debe poder escribir poco texto. Para lograr esto
se reduce el número de palabras claves.
Con ello se llegó a un compilador con un poderoso juego de instrucciones,
que permite aumentar la productividad/día de los programadores.
A pesar de ello el C es un lenguaje rápido de aprender, que deriva en
compiladores sencillos de diseñar, robustos, y que generan objetos
pequeños y eficientes.
Una de las características más apreciadas de C es su gran portabilidad,
gracias a que deja en manos de librerías las funciones dependientes de la
máquina, ¡y todo ello sin restringir el acceso a dicha máquina!
Estas y otras características lo hacen adecuado para la programación en
áreas tales como:
• Programación de sistemas
• estructuras de datos y sistemas de bases de datos
• aplicaciones científicas
• software gráfico
• análisis numérico
Constitución de un Programa en C (Encabezado, cuerpo y Cierre):
ENCABEZAMIENTO Las líneas anteriores a la función main() se
denominan ENCABEZAMIENTO (HEADER) y son informaciones que se le
suministran al Compilador. La primera línea del programa está compuesta
por una directiva: " #include " que implica la orden de leer un archivo de texto
especificado en el nombre que sigue a la misma ( <stdio.h> ) y reemplazar
esta línea por el contenido de dicho archivo. En este archivo están incluidas
declaraciones de las funciones luego llamadas por el programa ( por ejemplo
printf() ) necesarias para que el compilador las procese. Por ahora no nos
preocupemos por el contenido del archivo ya que más adelante, en el
capítulo
de
funciones,
analizaremos
exhaustivamente
dichas
declaraciones. Hay dos formas distintas de invocar al archivo, a saber, si el
archivo invocado está delimitado por comillas (por ejemplo "stdio.h") el
compilador lo buscará en el directorio activo en el momento de compilar y si
en cambio se lo delimita con los signos <.......> lo buscará en algún otro
directorio, cuyo nombre habitualmente se le suministra en el momento de la
instalación del compilador en el disco ( por ejemplo C:\TC\INCLUDE). Por lo
general estos archivos son guardados en un directorio llamado INCLUDE y el
nombre de los mismos está terminado con la extensión .h. La razón de la
existencia de estos archivos es la de evitar la repetición de la escritura de
largas definiciones en cada programa. Nótese que la directiva "#include" no
es una sentencia de programa sino una orden de que se copie literalmente
un archivo de texto en el lugar en que ella está ubicada, por lo que no es
necesario terminarla con "; ".
Ciclos repeticiones
Variables
Una variable es un nombre que se asigna a una localidad de memoria
que almacena un determinado valor, (el valor de la variable).
El nombre de una variable debe de cumplir con las siguientes reglas:
1. Serie de caracteres formados por letras, dígitos y subrayados,
(underscore: '_');
2. No debe empezar con un dígito;
3. Cualquier longitud (ANSI < 31 caracteres)
4. C trata como distintas las letras mayúsculas de las minúsculas, por lo que
se debe de tener cuidado en este aspecto al declarar una variable y
referenciarla más tarde
Los siguientes son ejemplos de nombres de variables válidos:
1.
2.
3.
4.
cachafas
toto12
Un_Nombre_de_variable_largo
x
1.
2.
3.
4.
Los siguientes son ejemplos no válidos de nombres de variables:
esto-no-se-vale
12x
(nombre)
variable$
LA DECLARACIÓN DE VARIABLES
•
Para poder utilizar una variable es necesario primero declararla.
•
Para declarar una variable se requiere especificar su tipo, nombre y
opcionalmente su valor inicial
•
La sintaxis de declaración es:
<tipo variable> <nombre variable> [, <nombre variable>];
Un ejemplo de declaración es:
int
i;
char
letra, opc;
unsigned short
s1, s2;
float
long
num, res;
grande;
Constantes:
•
Las constantes son datos cuyos valores permanecen constantes
durante la ejecución de un programa.
•
Son los posibles valores que una variable puede tomar.
•
Encontramos constantes numéricas y de caracteres.
•
Las constantes numéricas pueden expresarse en base ocho, diez y
16.
•
Ejemplos de constantes son:
- caracteres: 'c','d','e','\n','\0'
- decimal: 123, 345, -1943, +4567
- octal: 0123, 0456, 01234, 04567
- hexadecimal: 0x12, 0xf5ad12, 0x12f103
PALABRAS CLAVE
El lenguaje ANSI C está formado por 32 palabras clave que no pueden ser utilizadas
_
como nombres de variable ni de función.
La lista de palabras clave es:
Auto
break
case
char
Double
else
enum
extern
int
long
register return
struct
switch
typedef union
Const
continue default
do
float
for
if
goto
short
signed
sizeof
static
unsigne
d
void
volatile while
COMPONENTES BÁSICOS DEL LENGUAJE C
•
El objetivo de un programa es el de procesar información en forma de
datos, para obtener un determinado resultado.
•
Lo que diferencia un lenguaje computacional de otro es la forma de
representar los datos y las herramientas que ofrece para procesarlos.
Es decir:
o
o
o
o
o
o
o
o
o
Los tipos de datos que maneja
Su declaración de Variables
Las constantes
La forma de realizar asignaciones
La estructura general de un programa
Los comentarios
Sus operaciones de entrada/salida
Las operaciones condicionales
Las iteraciones
LOS TIPOS DE DATOS
C maneja cuatro clases de tipos:
1. los enteros:
(a) char
(b) short
(c) int
(d) long
2. los enteros sin signo:
(a) unsigned short
(b) unsigned int
(c)unsigned long
3. los flotantes:
(a) float
(b) double
4. los apuntadores
•
LOS ENUNCIADOS EN C
Las partes del programa que realizan operaciones sobre las variables
y/o datos del programa se conoce enunciados
•
Un programa esta formado por un gran número de instrucciones.
•
Es necesario saber donde termina una y donde empieza la otra.
•
Un enunciado es un conjunto de instrucciones que definen las
acciones a realizar.
•
Después de cada enunciado se debe teclear un punto y coma ; para
indicar que el enunciado terminó.
•
El enunciado es la unidad elemental de la estructura de un programa
•
C es un lenguaje secuencial ya que los enunciados son ejecutados
secuencialmente, uno después de otro, y nunca simultáneamente
ESTRUCTURA GENERAL DE UN PROGRAMA EN C
•
•
•
tipo var1;
tipo var2;
tipo f1(par1)
tipo par1;
{ tipo var3;
{ tipo var4;
Bloque 1
Bloque2
}
•
•
•
}
tipo var5;
int main()
{
tipo var6;
}
LOS COMENTARIOS
•
Un buen programa debe de contener notas o comentarios que faciliten
su comprensión a los lectores humanos
•
Los comentarios son ignorados por el compilador del lenguaje
•
Entre la información que generalmente se escribe como comentario
esta:
1. Nombre del autor
2. Fecha de última modifición del programa
3. Explicación general de lo que hace el programa
4. Explicación de lo que realiza cada función, sus parámetros de entrada y
de salida
5. Significado de las variables más importantes
C soporta dos tipos de comentarios:
1. comentarios de bloque: /* */
por ejemplo: /* esto no lo lee el compilador*/
2.comentarios de línea: incian a partir de la secuencia de caracteres: //
y hasta el fin de línea.
por ejemplo: // Esto no lo lee el compilador
•
LOS ARCHIVOS
•
Almacenamiento en variables y arreglos es temporal: termina
programa y estos datos se pierden;
•
Conservación permanente de grandes cantidades de datos: archivos;
•
Archivos almacenados en dispositivos almacenamiento secundario,
(p.e. disco);
•
C ve un archivo como un flujo secuencial de bytes, (stream); que se
conoce con el nombre de descriptor o manejador de archivos.
•
Cada archivo termina con un marcador de fin de archvio, (eof);
•
Cuando un archivo se abre se asocia un stream con el archivo;
•
La ejecución de un programa abre automaticamente tres archivos, los
cuales tienen relacionados tres streams:
•
1. stdi: entrada estándar, (que vale 0);
2. stdo: salida estándar, (valor: 1);
3. stderr: error estándar, (valor: 2);
Dos tipos de archivos:
1. Archivos tipo texto
2. Archivos binarios
Abertura de archivos texto
stream = fopen(nombre-archivo, modo)
stream: debe ser una variable tipo apuntador a un archivo FILE *<nombrevariable>
nombre-archivo: es el nombre de un archivo, el cual debe de estar entre
comillas, (''):
''/usr/local/tarea.txt''
también puede referenciarse usando un arreglo de caracteres:
char nombre[40]
nombre = ''/usr/local/tarea.txt''
modo: al igual que el nombre-archivo se puede expresar entre comillas o a
travez de un arreglo de caracteres;
Los valores que puede tomar modo son:
simbolo
si existe el archivo
si no existe
r
abre archivo para lectura
regresa NULL
w
abre archivo para escritura
archivo y abre escritura
a
abre archivo para añadir
archivo y abre escritura
b
declara archivo como binario
(manejado por fread() y fwrite())
error:
crea
crea
+ permite lectura y escritura
Ejemplos abertura archivos
main()
{
FILE *p, *q;
char nombre[25], modo[5];
/* Abriendo archivo texto en modo escritura */
if ( p = fopen(''ejemplo.txt'', ''w+''))
{
...
}
else
{
printf(''\n Error: no se pudo abrir el archivo \n'');
exit(1)
}
...
/* Abriendo archivo binario en modo lectura */
nombre = ''/usr/al445566/toto.dat''; modo = ''rb'';
if ( q = fopen(nombre,modo) == NULL)
printf(''No pudo abrirse el archivo nn'');
else
...
}
Críticas
Dentro de las principales críticas que se le achacan podemos destacar:
•
Lo poco estricto que es el lenguaje con la
comprobación de los tipos de datos, dejando esta tarea
muchas veces en manos del programador.
•
El no verificar automáticamente los límites de los
vectores.
•
La repetición que hace de símbolos en operadores
diferentes (=,*,-). (Sobrecarga de operadores).
•
El no poder anidar funciones, con lo que se
dificulta la estructuración y la abstracción de datos.
•
La incertidumbre existente en el orden de
evaluación de las listas de expresiones y parámetros.
•
La facilidad con que los programas pueden derivar
hacia ser crípticos.
for(i=0;i<10;i++)
for (j=0;j<10;)
*(*(x+i)+j++)=(y[i][j]>*(*(z+i)+j))?1:2;
for (;*a|*b;*p++=(*a>*b)?*a++;*b++);
Tipos de Datos
C utiliza 5 palabras reservadas para definir los tipos de datos
fundamentales. A diferencia de Pascal, un determinado tipo de datos puede
ir cualificado por un conjunto de modificadores que estudiaremos más
adelante.
Los tipos de datos fundamentales son:
char
short int
int
long int
unsigned char
unsigned short int
unsigned int unsigned long int
double
float
long float
void
Tipos de datos fundamentales
char
Representa un carácter en código ASCII, también se
puede interpretar como
un entero.
short int
Indica un entero de tamaño corto.
int
Entero igual que integer en Pascal.
long int
Entero largo.
unsigned short int Como short int pero sin signo.
unsigned int
Como int pero sin signo.
unsigned long int Como long int pero sin signo.
float
Flotante corto. Análogo al single de Pascal.
double
Flotante largo. Análogo al double de Pascal.
void
No indica ningún tipo. Es el tipo de las funciones que no
devuelven nada.
Los tipos short int, long int, unsigned int y long float se pueden escribir como:
short, long, unsigned y double.
Con respecto al tamaño que ocupan en memoria variables de estos tipos,
todo lo que garantiza C es:
sizeof(char) = 1
sizeof(short) <= sizeof(int) <= sizeof(long)
sizeof(unsigned) = sizeof(int)
sizeof(float) =< sizeof(double)
Donde sizeof es un operador que está incorporado en C y devuelve el
número de bytes que tiene un objeto.
Hay un grupo de modificadores que indican la forma que se almacena una
determinada variable de un determinado tipo. Se indica antes del tipo de la
variable.
static
Cuando se invoca a una función por segunda vez se pierden los valores que
las variables locales de la función tenían al acabar la anterior llamada.
Declarando una variable de este tipo cuando se llama por segunda vez a la
subrutina la variable static (estática) contiene el mismo valor que al acabar la
llamada anterior.
auto
Es lo mismo que si no se usara ningún modificador
volatile
El compilador debe asumir que la variable está relacionada con un
dispositivo y que puede cambiar de valor en cualquier momento.
register
El compilador procurará almacenar la variable cualificada de este modo en
un registro de la CPU.
extern
La variable se considera declarada en otro fichero. No se le asignará
dirección ni espacio de memoria.
Declaración de variables
La forma general de declarar variables en C es la siguiente:
cualificador tipo identificador = valor, identificador = valor, ... ;
Las expresiones = valor sirven para inicializar la variable y pueden ser
opcionales.
Las variables pueden ser declaradas en dos puntos: dentro de un bloque
antes de la primera línea ejecutable; en este caso el ámbito de la variable es
el cuerpo del bloque y fuera de todos los procedimientos, en este caso, el
ámbito abarca a todas las funciones, es decir son declaraciones globales. El
cuerpo de una función es considerado como un bloque.
int a,b,c;
Tres variables enteras.
float raiz1, raiz2;
Dos variables de tipo real.
char caracter, texto[80]; Un caracter y una cadena de 80.
short int a;
Entero corto.
long int b;
Entero largo.
unsigned short int d;
Entero corto sin signo.
unsigned char a;
Caracter sin signo.
signed char b;
Caracter con signo.
char texto[3] = "abc";
Declaración e inicialización
char a = '\n';
Inicialización con Return.
char texto[] = "abc";
Sin especificar tamaño.
extern unsigned short int Variable externa.
Descargar