Unidad 4 Principios del lenguaje C 1 Objetivos n n n n n n n Conocer la historia y los fundamentos del Lenguaje C. Conocer la estructura y el aspecto general de un programa en C. Conocer las herramientas básicas que ofrece este lenguaje de programación: tipos de datos, constantes, operadores, etc. con el fin de que el alumno comience a usar el lenguaje en sencillos programas de lectura proceso y escritura de variables. Usar los operadores conociendo su orden de prioridad y asociatividad. Conocer las distintas conversiones de tipos de datos para construir correctamente las expresiones. Conocer las funciones de E/S y la librería que las contiene. Hacer consciente al alumno de que tiene un lenguaje de programación para dar órdenes a la máquina y que dependiendo del uso, correcto o incorrecto, que haga de él conseguirá un funcionamiento bueno o malo de la misma. n n n n n n n Distinción de las tres estructuras básicas de la programación estructurada escritas en C. Correcta composición y escritura de las expresiones lógicas que sirven como condiciones con las herramientas que C nos proporciona. Diferenciación entre procesos que se excluyen y procesos dependientes en la sintaxis correspondiente en C. Correcto control de los bucles, y utilización de contadores y acumuladores en algoritmos que se codifican en lenguaje C. Realización de procesos de lectura en número indeterminado utilizando para ello las funciones que el lenguaje nos proporciona. Conocimiento y empleo de las variables de control de proceso (indicadores o flags) con los tipos de datos incorporados. Distinción entre los distintos tipos de estructuras de control de que dispone C y elección de la más adecuada a cada caso concreto. 2 1 Contenidos n n n INTRODUCCIÓN ESTRUCTURA GENERAL DE UN PROGRAMA EN C q Comandos del preprocesador q Definiciones de constantes q Definiciones de tipos q Declaración de prototipos de funciones y procedimientos q Declaración de objetos globales q Función main q Definición de subprogramas ALGUNOS COMPONENTES LÉXICOS DEL LENGUAJE n TIPOS DE DATOS ELEMENTALES n VARIABLES n MODIFICADORES DE ALMACENAMIENTO q automatic o auto (sólo para objetos locales) q register (sólo para objetos locales) q static (para objetos, funciones y uniones anónimas) q extern (para objetos y funciones) n CONSTANTES n OPERADORES q Operadores aritméticos q Operadores relacionales q Operadores lógicos q Otros operadores n EXPRESIONES q Expresiones lvalue y rvalue q Conversiones de tipo q Espaciado y paréntesis q Precedencia y asociatividad de operadores n FUNCIONES BÁSICAS DE ENTRADA/SALIDA EN C n SENTENCIAS n ESTRUCTURA SECUENCIAL n ESTRUCTURAS DE SELECCIÓN SIMPLE n ESTRUCTURAS REPETITIVAS . n n ESTRUCTURA DE SELECCIÓN MÚLTIPLE PROPOSICIONES ESPECIALES q break q continue q goto 3 Historia ORÍGENES DEL C [1967] Martin Richards desarrolló BCPL como lenguaje para escribir software de sistemas operativos y compiladores [1970] Ken Thompson desarrolló B con él que se construyeron las primeras versiones de UNIX para los Laboratorios Bell (ATT). [1972] Ritchie implementó en un DEC -PDP-11 de los Lab. Bell una evolución del B: C. Con él se desarrolló UNIX. El Sistema Operativo, el compilador de C y esencialmente todos los programas de aplicación de UNIX están escritos en C [ K&R, p. xi] [1978] Kernighan y Ritchie: The C programming Language. Prentice Hall. Consolida el C tradicional, clásico o C de Kernighan y Ritchie. [1988] Segunda edición de K y R.. Anuncian el ANSI/ISO [1989] Se aprobó el standard ANSI/ISO para el C. [1990] Se publicó el documento que fija el C ANSI/ISO. C++ [1980-5] Bjarne Stroustrup desarrolló en Lab. Bell el C++. Orientación a Objetos [1997] Stroustrup: The C++ Programming Language, tercera edición. Addison-Wesley . La segunda era del 1991. [1998] Publicación del documento ANSI/ISO sobre C++ C# [2002] Es un lenguaje derivado de C/C++ y Java desarrollado por Microsoft. 4 2 Características del lenguaje C n n n n n n n Lenguaje de nivel medio Es un lenguaje estructurado De propósito general Portable y compacto Pocas palabras reservadas (43 en C y 48 en C++) Gramática sencilla y flexible Variedad de operadores 5 Estructura general de un programa en C < < < < Comandos del preprocesador > Definición de constantes> Definición de tipos > Declaración de prototipos de funciones y procedimientos > < Declaración de objetos globales > Función main { < Declaración de objetos locales> < instrucciones ejecutables> } < Definición de funciones y procedimientos > /*Ejemplo1: Escribir un programa en C que cree una tabla de conversión de Euros a pesetas desde 1 a 100 Euros (Nota: 1 Euro = 166.386 pts).*/ #include <stdio.h> #define LOWER 0 #define UPPER 100 #define EURO 166.386 int main() { int euro; /* Declaración de variables */ for (euro = LOWER; euro <= UPPER; euro = euro + 5) { printf ("%3d\t%8.2f\n", euro, euro * EURO); } return (0); } 6 3 Primera aproximación •Preprocesador •Definiciones de nuevos tipos: typedef tipo nombre_nuevo tipo Di cuáles son permitidos y cuales no: •Objetos globales y locales 1. Int •Función main 2. Enteros •Subprogramas Precio_venta 3. Precio venta •Comentarios 4. P_V_P nDelimitadores: ; , ( ) { } [ ] 5. 5horas horas5 n identificadores : permiten referenciar a constantes, variables, funciones y otros objetos definidos por el usuario. q Comienzan por letra o _ (normalmente en librerías estándar ) q Seguido por letras, números o _ q No puede tener espacios o caracteres de puntuación q Tamaño máximo depende del compilador q Mayúsculas <> minúsculas q No permitidas ni palabras reservadas ni funciones de C 7 Tipos de datos Modificadores de tipo: short, long, signed y unsigned 8 4 Variables Declaración n [ modif. Almacenamiento ] [ modif. Tipo ] tipo lista_variables; char continuar = ‘s’; long int Tipos_Especias ; float sueldo = 2590.54; n Tipos de variables q Local Declarada y conocida dentro de la función o estructura que la usa. q global Declarada antes del main y conocida por todo el programa. NO DEBEN USARSE: . Efectos laterales . Afectan a la independencia y modularidad Página 169 . Distintos tipos de almacenamientos 9 Variables II n Modificadores de almacenamiento q automatic o auto . Es el modo por defecto de las variables locales . Se crean en la pila . No suele especificarse q Register Se almacenan en un registro del micro. q static Se almacenan en el segmento de datos. . Contadores rápidos . Usado en objetos globales por defecto . El compilador los inicializa a 0 . Si se declara dentro de una función conservará su valor entre una llamada y otra. q extern Las funciones son externas por defecto . Si la variable es global nos indica que ya está declarada en otro archivo fuente. . Si la variable es local indica que está declarada en otra parte de la función. Ver ejemplo página 169 10 5 Constantes n n Literales: se usan directamente. Ej: 4, L87, 3.14, 1.2 e + 3, ‘a’, “ hola” Simbólicas: # define nombre_identificador valor_constante Operadores aritméticos 11 Operadores relacionales Operadores lógicos 12 6 Asignación = Incremento ++ a = 5; b = ++ a; En la salida : a vale 6 y b vale 6 decremento – – a = 5; b = a ++; En la salida : a vale 6 y b valen 5 sizeof ( tipo-dato ) devuelve un entero, la cantidad de bytes de su operando sizeof (float) à devuelve 4 char caracter à sizeof ( caracter) à devuelve 1 int array [30] à sizeof (array) à devuelve 30 x 2 = 60 13 Prioridad de los operadores Página 180 del libro – corregir menor precedencia 14 7 Conversiones de tipo Al evaluar una expresión: ésta se va convirtiendo al tamaño del dato mayor Para forzar una conversión: (tipo) operador à (int) real En expresiones: al de mayor tamaño. En asignaciones: char, unsigned char, signed char, short 6 unsigned 6 long 6 unsigned long 6 float 6 double float a = 5, b = 2; float resul = a / b; // resul = 2.5 int resul2 = (int) a / b; // resul2= 2 sin pérdida: float a = 375; int b = ‘ H’; long c = - 45; double d = 9.6; float e = 250; con pérdida: char a = 450; int b = 520745; int c = 75.45; float d = 1.58 e – 62; 6 long double 15 Salida estándar : printf ( ) – I – n n printf ("cadena de control”,arg1,arg2, arg3,..., argn); Caracteres de control Secuencias de escape 16 8 Salida estándar : printf ( ) – II – modificadores de formato: n q q q q ajuste a la izquierda: longitud mínima de campo: n precisión: n.m (n mínimo parte entera y m decimales a visualizar, si lo aplicamos a caracteres tendremos tamaño mínimo n y tamaño máximo m si la cad ena es más larga se truncan los caracteres). modificador variable: *.*, los tamaños se pasan como parámetros. Ejemplos: #include <stdio.h> #define texto “¡BUENOS DIAS!” void main (void) { printf ( “///// %2s\n”,texto); printf (“///// %22s\n”,texto); printf (“///// %22.5s\n”,texto); printf (“///// %-22.5s\n”,texto); } SALIDA: /////¡BUENOS DIAS! ///// ¡BUENOS DIAS! ///// ¡BUEN /////¡BUEN 17 Salida estándar : printf ( ) – III– Ejemplos: #include <stdio.h> #define texto “¡BUENOS DIAS!” void main (void) { SALIDA: (ø espacio blanco) ^ ø ø 123.2300, 448^ ^123.2300 ø ø, 448 ø ø ø ø ø ^ ^123.2, 1.2323e+02^ ^ ø ø ø ø ø 123.3^ el dinero no lo tengo, tengo 7000 de las antiguas pesetas printf ( “^ %10.4f, %2d^\n”,123.23, 448); printf (“^ %-10.4f, %-8d^\n”,123.23, 448); printf (“^ %-3.1f, %e^\n”,123.23, 123.23); printf (“^ %*.*f\n”,10, 1,1234.34); printf (“el dinero no lo tengo”); printf (“, tengo %u \nde las antiguas pesetas \n”, 7000); } 18 9 Entrada estándar: scanf ( ) – I – n n n scanf ("cadena de control”, &arg1, &arg2, &arg3,..., &argn); Caracteres de control son los mismos que con printf( ). Hay que añadir %[ ] – datos permitidos - y el %*d – lee y no carga - Ejemplo1: Ejemplo2 (para %*d): #include <stdio.h> #include <stdio.h> void main (void) void main (void) { { int edad, hoy; int n; char nombre[25]; printf (“ Introduce 3 números: \n”); printf (“ Deme su nombre: ”); scanf (“%*d %*d %d”, &n); scanf (“%s”, nombre); printf (“El número leido es: %d.”, n); printf (“ Deme su edad: ”); } scanf (“%d”, &edad); printf (“ Deme el año actual con 4 cifras: ”); scanf (“%d”, &hoy); printf (“%s, nacistes el año %d.”, nombre, hoy - edad); } 19 Entrada estándar: scanf ( ) – I I– Ejemplo 3 (para %[ ]d): #include <stdio.h> void main (void) { char c; printf (“ Deme la afirmación correcta: \n ”); printf (“ a) El ; marca el fin de una instrucción en C \n”); printf (“ b) El } marca el fin de una instrucción en C \n”); printf (“ c) No es necesario marcar el fin de una instrucción en C \n”); printf (“ ¿Opción?: ”); scanf (“%[abc] c”, &c); /* podemos decir scanf (“%[a-c]c”, &c); */ switch ( c ) { case ‘a ‘: printf (“ Correcto!!!!!! ”); break; case ‘b’: case ‘c’: printf (“ A ESTUDIAR!!!!!! ”); break; default: printf (“Opción no permitida”); } } 20 10 Estructura secuencial Estructuras iterativas n if (expresión-condicional) proposición1 [else] proposición2 while while (expresión-condicional) proposición1 Ejemplo: página 191 Ejemplo: página 190 Sentencias o proposiciones n n do Simple: contienen una única instrucción y acaban en Compuesta o doble: conjunto de instrucciones simples colocadas entre ; n do-while proposición1 while (expresión-condicional); Ejemplo: página 192 {} 21 Estructura repetitiva para n exp1 for for ([exp1]; [exp2]; [exp3]) proposición • for (;;); bucle infinito. • for (;i < 5 && n > 0;) { printf ( “ deme número”); scanf (“%d”,&n); if (n > 0) i++; } bucle para con sólo exp2 exp2 proposición exp3 22 11 Estructura de selección múltiple switch (expresión) { case const 1: const 1 proposición 1 break proposición1 [ break;] case const 2: const 2 proposición 2 default proposición n proposición2 [break;] … case const 3: proposición n [break;] [default:] proposición } /* Fin de switch. */ break Ejemplo: página 195 23 Estructuras de salto: sólo usaremos break en switch break; Salida de la estructura que lo contiene. continue; Devuelve el control a la expresión condicional de la estructura en la que se encuentra. goto etiqueta; Salto incondicional a la etiqueta llamada. La etiqueta debe ser colocada y debe acabar en “:” Ejemplo: apoyo4_1.cpp 24 12