Departamento de Lenguajes y Sistemas Informáticos
INTRODUCCIÓN A LA PROGRAMACIÓN 1
1
Prácticas de Laboratorio Temario Práctica 1: Práctica 2: Práctica 3: Práctica 4: Práctica 5: Práctica 6: Práctica 7: Práctica 8: Práctica 9: Práctica 10: Práctica 11:
Entorno de trabajo / Introducción al lenguaje C Estructuras de control selectivas Estructuras de control repetitivas Funciones (I) Funciones (II) Módulos Tablas Cadenas de caracteres Estructuras Ficheros de texto Ficheros binarios 2
Entorno de Trabajo
•Entornos de programación •Edición, compilación, ejecución y depuración •Entorno Microsoft Visual C++ •Edición,Compilación y Ejecución •Ejecución paso a paso. •Guardar
3
Entorno de Trabajo
EDITORES DE TEXTO (Edit, Bloc de Notas, Word, Latex)
APLICACIONES PROGRAMAS (Propietarios y Multiplataforma) SISTEMAS OPERATIVOS HARDWARE
ENTORNOS OFIMATICOS (Office, Lotus, WordPerfect...) ENTORNOS DE PROGRAMACION (Visual C++, Turbo C, Visual Basic, etc) APLICACIONES DE RED (TELNET, FTP, H323...) NAVEGADORES (Netscape, Explorer)
WINDOWS MS-DOS
UNIX, NT, LINUX, Windows 2000, XP
(IX86, Pentium 4, Alpha, ...) 4
Fases de la Compilaci贸n en General Bibliotecas de terceros
Ficheros Fuentes
COMPILADOR
Programa Ejecutable
Bibliotecas est谩ndar
5
Fases de la Compilación en C Fuente
Compilador *.LIB Precompilación Compilación Enlazado
*.C
Programa *. EXE
*.H
*.C”
*.OBJ
*.LIB Biblioteca estándar
Ficheros intermedios 6
INTRODUCCIÓN AL LENGUAJE C 1. Introducción 2. Descripción general del lenguaje 3. Estructura general de un programa 4. Declaración de importaciones 5. Definición de constantes 6. Declaración de variables 7. Definición de tipos 8. Expresiones 9. Asignación 10. Entrada y Salida 7
INTRODUCCIÓN AL LENGUAJE C OBJETIVOS • Estudiar los elementos básicos del lenguaje C: constantes, variables, tipos, expresiones y operadores, asignación, entrada y salida • Realizar los primeros programas en lenguaje C
8
INTRODUCCIÓN AL LENGUAJE C 1. Introducción El lenguaje C fue diseñado por Brian Kernighan y Dennis Ritchie en la segunda mitad de los años 70. C es un lenguaje de alto nivel que posee muchas de las facilidades propias de los lenguajes de bajo nivel. El lenguaje C que estudiaremos será el estándar ANSI (American National Standard Institute).
9
INTRODUCCIÓN AL LENGUAJE C 2. Descripción general del lenguaje 2.1. Características generales Cuando se diseñó este lenguaje, se pretendía realizar un lenguaje de propósito general que produjese un código:
• • • •
portable rápido eficiente compacto
10
INTRODUCCIÓN AL LENGUAJE C 2.2. Elementos sintácticos Palabras clave: aquellas que tienen un significado especial para el auto double int struct auto double int struct compilador.
break else long switch break else long switch ¡¡Sóloregister son 32!! typedef case enum case enum registertypedef Identificadores: nombres que referencian diferentes elementos de char extern return char extern returna losunion union un programa que no float son palabras clave. const short unsigned const float short unsigned continue for signed void continue for signed void Un identificador debe comenzar por una letra o el carácter default sizeof volatile default sizeof volatile subrayado (_) goto ygoto puede ir seguido por dígitos, letras o el carácter subrayado. do if static do if static while while ¡Se distingue entre mayúsculas y minúsculas.! 11
INTRODUCCIÓN AL LENGUAJE C Delimitadores: signos especiales que permiten al compilador separar y reconocer las diferentes unidades sintácticas del lenguaje. Los principales signos delimitadores son: ; se considera el terminador, que es necesario cuando finaliza cada una de las sentencias o declaraciones. , separa dos elementos consecutivos de una lista. ( ) enmarca una lista de parámetros. [ ] enmarca la dimensión o el subíndice de una tabla. {} enmarca un bloque de instrucciones o una lista de valores iniciales. 12
INTRODUCCIÓN AL LENGUAJE C Conviene utilizar espacios y/o paréntesis adecuadamente con objeto de hacer más legible el código fuente de los programas. Por ejemplo, las dos expresiones:
x = y/7-34*temp;
x = (y/7)-(34*temp);
son equivalentes, siendo la segunda mucho más legible.
13
INTRODUCCIÓN AL LENGUAJE C Los comentarios en C van entre los caracteres '/* ' y '*/'; por ejemplo, /* Este es un comentario de una línea */ /* Este es un comentario de dos líneas */ Los comentarios no deben anidarse unos en otros, pues los compiladores antiguos no los interpretan correctamente: /* aquí hay un comentario /* anidado */ que es incorrecto */
14
INTRODUCCIÓN AL LENGUAJE C 3. Estructura general de un programa declaración de importaciones definición de constantes definición de tipos declaración de prototipos void main (void) { Ejemplo declaración de Ejemplo variables instrucciones #include #include <stdio.h> <stdio.h> } void main void main (void) (void) {
{ definición de funciones int int a, a, b; b;
}}
printf printf ("\nIntroduzca ("\nIntroduzca dos dos números: números: "); "); scanf ("%d%d", &a, &b); scanf ("%d%d", &a, &b); printf printf ("\n\nEl ("\n\nEl producto producto es: es: %d", %d", a*b); a*b); 15
INTRODUCCIÓN AL LENGUAJE C 4. Declaración de importaciones Se utilizan para comunicar al compilador dónde está la información necesaria para interpretar correctamente las funciones, constantes y tipos utilizados en el programa. Esta información se almacena en un fichero de extensión .h (fichero de cabecera, header file) que se importa mediante:
#include <nombre_fichero_cabecera.h> El fichero de cabecera puede corresponderse con el uso de : • Biblioteca estándar (el más frecuente)
• •
stdio.h (funciones de entrada y salida) math.h (funciones matemáticas)
• Otros módulos del mismo programa (Práctica 6) • Bibliotecas de terceros (Práctica 6) 16
INTRODUCCIÓN AL LENGUAJE C 5. Definición de constantes Pueden ser de varios tipos de datos. En el caso de constantes de tipo carácter, éstas irán encerradas entre comillas simples, utilizándose las comillas dobles en el caso de cadenas de caracteres. El formato de uso es:
#define identificador_constante valor_constante Ejemplos: #define #define #define #define
PI 3.14159 MAXIMO 999 ULTIMALETRA 'Z' MENSAJE "Introduzca su edad:“
En la precompilación se sustituyen los identificadores con su valor real. (Se sustituye el identificador_constante por valor_constante) 17
INTRODUCCIÓN AL LENGUAJE C 6. Declaración de variables Permiten recuperar y almacenar valores de un tipo determinado a través de un identificador. • Los Identificadores son alfanuméricos (incluido el ‘_’) y deben comenzar por una letra. Ejemplos:
suma
Suma_total
contador1
NotaMaxima
• La longitud máxima del identificador es de 32 caracteres. • Deben declararse antes de su utilización.
18
INTRODUCCIÓN AL LENGUAJE C Los tipos básicos de variables son:
• char, que representa un carácter • int / long, que representa un número entero • float / double, que representa un número real Equivalencia con los tipos de datos de LEA:
TIPOS DE DATOS LEA C carácter char int / long entero float / double real 19
INTRODUCCIÓN AL LENGUAJE C También existe el tipo void, que representa la ausencia de tipo. La declaración de las variables se hace de acuerdo con el siguiente formato:
tipo lista_de_identificadores; Ejemplos.-
char c; int i, j; long potencia; double radio, longitud;
20
INTRODUCCIÓN AL LENGUAJE C Variables tipo carácter y códigos ASCII. Las constantes y variables de tipo char se almacenan en un byte, por tanto pueden almacenar 28=256 valores diferentes (no todos tienen grafía). La correspondencia entre un carácter y el lugar que ocupa dentro de los 256 no es única. La más habitual en los PC’s es conocida como codificación ASCII (American Standard Code for Information Interchange). Primero los números después las mayúsculas y después las minúsculas.
'0': 48 '1': 49 '2': 50 ... '9': 57 'A': 65 'B': 66 'C': 67 ... 'Z': 90 'a': 97 'b': 98 'c': 99 ... 'z': 112 21
INTRODUCCIÓN AL LENGUAJE C No hay una relación especial entre el valor del carácter constante que representa un dígito y el valor entero intrínseco del dígito; es decir, el valor de '3' no es 3. El hecho de que los valores de 'a', 'b', 'c', etc. sean correlativos es importante, pues simplifica la clasificación de caracteres y palabras en orden alfabético. Algunos caracteres no son imprimibles, y se representan de una forma
'\n' (nueva línea), '\r' (retorno de carro) y '\0' (carácter nulo) se conocen como Secuencias de Escape
especial, por ejemplo,
22
INTRODUCCIÓN AL LENGUAJE C 7. Tipos definidos por el usuario Simplifican la escritura de programas reales (‘los de verdad’), pues permiten que el programador pueda utilizar tipos de datos cercanos al problema a tratar. La instrucción para definir un nuevo tipo es:
typedef tipo Nombre; Ejemplos:
typedef enum {Falso, Cierto} Logico; typedef int Contador; typedef enum {rojo, verde, azul} Color; La declaración de variables de tipos de usuario no varía, por ejemplo:
Logico encontrado; Contador i, j;
Color color_fondo; 23
INTRODUCCIÓN AL LENGUAJE C 8. Expresiones Permiten expresar diversos tipos de operaciones entre los elementos de un programa (constantes, variables y funciones).
8.1. Operadores aritméticos Operan sobre datos de tipo numérico, y son los siguientes: - resta (menos unario) + suma
* producto / división
% -++
módulo decremento incremento
Ejemplos de expresiones aritméticas: (votos/electores)*100 horas*3600+minutos*60+segundos
a*x*x + b*x + c (alto-bajo)/2 24
INTRODUCCIÓN AL LENGUAJE C 8.2. Operadores relacionales Operan sobre elementos de diferentes tipos y evalúan un tipo lógico: > mayor que < menor que >= mayor o igual que <= menor o igual que == igual que != distinto de Ejemplos de expresiones relacionales: x >= (y+z) contador < MAXIMO numero%2 == 0 ordenado != Cierto 25
INTRODUCCIÓN AL LENGUAJE C 8.3. Operadores lógicos Estos operadores operan sobre tipos lógicos, evaluando un tipo lógico: && Y ||
O
!
NO
Ejemplos de expresiones lógicas: (opcion < MINIMO) || (opcion > MAXIMO) (opcion >= MINIMO) && (opcion <= MAXIMO) ! encontrado
La evaluación de los operadores lógicos en C es perezosa. 26
INTRODUCCIÓN AL LENGUAJE C 8.4. Conversión de tipo en las expresiones Cuando en una expresión se mezclan constantes y/o variables de distintos tipos, estos se convierten a un tipo único. El compilador de C convierte todos los operandos hacia el tipo del operando de mayor tamaño. Esto se hace operación a operación. Ejemplos: int i; double d; i + d es del tipo double. int i= 100, j= 3; float f; f= i/j; ¿qué se almacena en f?
27
INTRODUCCIÓN AL LENGUAJE C 8.5. Precedencia y asociatividad de operadores ¿Cómo resuelve el compilador la expresión ‘Res= 4 + 6 / 3 * 2? • Reglas de precedencia. Establecen prioridad entre los operadores. Los paréntesis pueden alterar el orden de ejecución de las operaciones, ya que las expresiones que están dentro de los paréntesis se evalúan en primer lugar. •
Reglas de asociatividad. Resuelven la ambigüedad entre operadores de la misma prioridad. ea ahora la expresión
La expresión anterior es equivalente, pues, a la siguiente: 4 + ((6 / 3) * 2)
28
INTRODUCCIĂ&#x201C;N AL LENGUAJE C Operador
Asociatividad
! ++ -- - (unario)
derecha a izquierda
* / %
izquierda a derecha
+ -
izquierda a derecha
< <= > >=
izquierda a derecha
== !=
izquierda a derecha
&&
izquierda a derecha
||
izquierda a derecha 29
INTRODUCCIÓN AL LENGUAJE C 8.6. Funciones En una expresión pueden intervenir funciones. En las expresiones aritméticas suelen utilizarse funciones matemáticas cuyo código se encuentra en la biblioteca estándar del compilador. Para utilizar dicha biblioteca será necesario importar el fichero de cabecera math.h: sin (x) seno de x cos (x) coseno de x tan (x) tangente de x Los ángulos para las Los ángulos para las x exp (x) función exponencial e funciones funciones log (x) logaritmo natural ln(x), x>0 trigonométricas están trigonométricas están y pow (x, y) potencia x expresados expresadosen enradianes radianes sqrt (x) raíz cuadrada de x yyse seutiliza utilizaeleltipo tipodouble double fabs (x) valor absoluto |x| para parasu surepresentación representación 30
INTRODUCCIĂ&#x201C;N AL LENGUAJE C Ejemplos de expresiones (-b + sqrt(b*b - 4*a*c))/(2*a) (x >= MINIMO) && (x <= MAXIMO) (contador < MAXIMO) && !encontrado (anyo1 < anyo2) || (anyo1 == anyo2) && (mes1 < mes2) anyo%4 == 0 && anyo%100 !=0 || anyo%400 == 0
31
INTRODUCCIÓN AL LENGUAJE C 9. Asignación La operación de asignación consiste en asociar un valor a una variable a través de una expresión. La sintaxis en C es la siguiente: nombre_de_variable = expresión ; Primero se evalúa la expresión y luego se almacena el valor obtenido en la variable que aparece a la izquierda del operador de asignación (símbolo =). Por ejemplo, contador = 1; media = (a + b) / 2.0; i = i + 1; kilometros = 1609 * millas; suma = 0;
Se puede asignar un valor inicial a una variable cuando se declara: int suma = 0; 32
INTRODUCCIÓN AL LENGUAJE C Transformación a C de la asignación múltiple de LEA LEA <x1, x2, ..., xn> := <e1, e2, ..., en>
C x1 = e1; x2 = e2; ... xn = en;
Transformación a C del intercambio de variables en LEA LEA <x, y> := <y, x>
C t1 = y; t2 = x; x = t1; y = t2; 33
INTRODUCCIÓN AL LENGUAJE C 9.1. Operadores de incremento (++) y decremento (--) La asignación
i = i + 1; se puede simplificar utilizando el operador de incremento (++):
i++; El operador de incremento también se puede utilizar dentro de una expresión más compleja, pero no es recomendable hacerlo. Así por ejemplo, la expresión
x = 5 + y++; deberá escribirse como
x = 5 + y; y++;
Uso del ++ / -Sólo a la derecha de la variable y nunca en una expresión 34
INTRODUCCIÓN AL LENGUAJE C 10. Entrada y salida No hay palabras reservadas del lenguaje que realicen tareas de entrada/salida, sino que todas estas operaciones están suministradas por la biblioteca estándar. Para utilizarlas es preciso importar el fichero de cabecera stdio.h
10.1. Entrada y salida de caracteres: funciones getchar y putchar getchar: lee un carácter de la entrada estándar (teclado) y devuelve su valor cuando se pulsa RETORNO. La función putchar escribe un carácter en la salida estándar (pantalla). char ch; ch = getchar (); putchar (ch);
lee un carácter del teclado, lo asigna a ch y lo escribe en la pantalla. 35
INTRODUCCIÓN AL LENGUAJE C 10.2. Entrada y salida de cadenas: funciones gets y puts La función gets lee una cadena de caracteres de la entrada estándar, mientras que la función puts escribe una cadena de caracteres en la salida estándar, saltando a la línea siguiente. Ejemplos: puts ("Escriba su nombre:"); gets (nombre);
36
INTRODUCCIÓN AL LENGUAJE C 10.3. Entrada y salida con formato: funciones printf y scanf La función printf permite escribir una lista de datos con un formato preestablecido. Acepta diferentes tipos de argumentos: carácter, valor numérico entero o real o cadena de caracteres, y los escribe según un formato especificado sobre la salida estándar. La forma de la función printf es: printf ("formato", arg1, arg2, ..., argn); donde argi pueden ser constantes, variables o expresiones, y “formato” es una serie de caracteres en la cual se pueden encontrar dos tipos de datos: un mensaje o texto a escribir literalmente, y los símbolos especificadores del formato con el cual se van a escribir las variables dadas como argumentos. Por ejemplo:
printf ("Esto es un mensaje\n");
Escribe la cadena Esto es un mensaje seguida de un salto de línea (debido al \n) 37
INTRODUCCIÓN AL LENGUAJE C Los especificadores de formato deben ir precedidos del signo %. Algunos de ellos son: %c carácter (char) %d número entero (int) %ld número entero (long) %f número real (float) %lf número real (double) %s cadena de caracteres Por cada argumento a imprimir debe existir un especificador de formato, que indica el formato en el cual se va a mostrar el dato. Por ejemplo, siendo letra una variable de tipo char con el valor ‘A’, la instrucción printf (“El código ASCII de %c es %d”, letra, letra);
escribirá El código ASCII de A es 65 38
INTRODUCCIÓN AL LENGUAJE C Otros ejemplos de printf: printf (“\nEl cuadrado de %f vale %f”, x, x*x); printf (“\nLa edad de %s es %d años”, “Juan”, edad); printf (“\nSeno (%lf) = %lf\n”, x, sin(x));
La función printf puede emplearse sin argumentos, en cuyo caso sólo se imprimen los caracteres presentes en la cadena de formato.
39
INTRODUCCIÓN AL LENGUAJE C Entre el símbolo "%" y el carácter que especifica la notación a emplear se pueden insertar ciertos caracteres opcionales. Son los siguientes: • El signo (-) para que el dato se ajuste por la izquierda, en lugar de hacerlo por la derecha, que es lo establecido por defecto. • Un número que indica la longitud mínima en caracteres que tiene el campo donde se mostrará el dato. Los espacios hacen de caracteres de relleno. • Un punto decimal (.) seguido de una cifra que indica el número de dígitos tras el punto decimal de un dato real o el número mínimo de dígitos para un entero o el número máximo de caracteres de una cadena que serán impresos
40
INTRODUCCIÓN AL LENGUAJE C Por ejemplo, %8d %-25s
%.6f
imprime un número decimal (int) alineado por la derecha y en un campo de al menos ocho caracteres. imprime una cadena de caracteres alineada por la izquierda y asegurando una longitud mínima de 25 caracteres (reserva al menos 25 espacios, si la longitud del valor a visualizar es mayor de 25 se visualizan todos). imprime un número real (float) con un máximo de 6 cifras significativas en la parte fraccionaria.
41
INTRODUCCIÓN AL LENGUAJE C La función scanf permite leer valores desde la entrada estándar y almacenarlos en las variables que se especifican como argumentos. Éstas deben ir normalmente precedidas por el símbolo &. La sintaxis es: scanf ("formato", arg1, arg2, ..., argn); donde debe haber tantos especificadores en la cadena de “formato” como variables en la lista de argumentos. Por ejemplo, int n; double x; scanf ("%d%lf", &n, &x); para leer un valor de tipo int y otro de tipo double. Los valores se introducirán desde la entrada estándar separándolos por espacios o retornos de carro. En la cadena de formato aparecen especificadores de formato (los mismos que ya se han visto) pero nunca deben aparecer caracteres ordinarios. 42
INTRODUCCIÓN AL LENGUAJE C Como ejemplo del uso de printf y scanf, sea un programa que lee dos números del teclado y calcula e imprime la suma de ambos: /* Programa que lee dos números y los suma */ #include <stdio.h> void main (void) { int a, b, suma; printf ("\nIntroduzca a y b: "); scanf ("%d%d", &a, &b); printf ("\n a vale: %d; b vale %d", a, b); suma = a + b; printf ("\n\nLa suma de a y b vale: %d\n", suma); } 43