4 ELEMENTOS BÁSICOS DE PROGRAMACIÓN... 2 4.1 DEFINICIONES. PALABRAS RESERVADAS BÁSICAS DEL LENGUAJE C... 2 4.2 TIPOS, VARIABLES Y CONSTANTES... 3 4.2.1 Tipos de Datos Fundamentales.... 3 4.2.2 Variables y Constantes... 6 4.2.3 Declaración de variables... 8 4.2.4 Declaración de una constante... 9 4.3 OPERACIONES BÁSICAS ARITMÉTICO-LÓGICAS. OPERADORES Y EXPRESIONES.... 10 4.3.1 Operación de asignación... 11 4.3.2 Operadores aritméticos... 11 4.3.3 Operadores relacionales... 12 4.3.4 Operadores lógicos... 13 4.3.5 Expresiones.... 13 4.3.5.1 Reglas de precedencia y asociatividad... 13 4.3.5.2 Conversiones de tipos en las expresiones... 14 4.3.5.3 Coherencia de tipos. Operaciones de CAST. Moldes... 15 4.4 OPERACIONES BÁSICAS DE ENTRADA-SALIDA... 16 4.4.1 E/S por consola... 16 4.4.2 E/S por consola con formato... 16 4.4.2.1 Constantes de carácter con barra invertida... 18 4.5 EJEMPLO: NUESTRO PRIMER PROGRAMA... 19 APENDICE: LA BIBLIOTECA ESTÁNDAR DE C... 20 TABLA CÓDIGOS ASCII... 21 Tema 4. Pág. 1
4 Elementos básicos de programación 4.1 Definiciones. Palabras reservadas básicas del lenguaje C El lenguaje C fue inventado e implementado por primera vez por Dennis Ritchie. Con el tiempo fueron apareciendo muchas implementaciones de C y aparecieron discrepancias. Para remediarlas el instituto de estándares americano (ANSI) estableció un estándar que definió de una vez por todas el lenguaje C. La lista de las 32 palabras clave, definidas por el estándar ANSI, junto con las añadidas por cada compilador de C particular, y junto con la sintaxis formal del lenguaje C, conforman el lenguaje de programación C. C es un lenguaje que diferencia entre MAYÚSCULAS y minúsculas. Una característica de las palabras clave es que son reservadas, es decir, que no deben ser usadas para otro propósito en un programa en C, más que para el que han sido definidas Todos los programas en C consisten en una o más funciones. La única función que debe estar absolutamente presente es la denominada main(), puesto que es la primera función que es llamada cuando comienza la ejecución del programa y esboza lo que el programa hace (es la función Principal). Tema 4. Pág. 2
Dentro del código de cualquier programa en C, podemos incluir comentarios. En C, podemos poner dos tipos de comentarios: /* TEXTO DEL COMENTARIO */ para un bloque // TEXTO DEL COMENTARIO para una línea. 4.2 Tipos, Variables y Constantes 4.2.1 Tipos de Datos Fundamentales. Existen 5 tipos de datos atómicos (simples o básicos) en C: carácter, entero, coma flotante, coma flotante de doble precisión, y sin valor. El tipo sin valor (void), tiene tres usos: Para declarar una función como que no devuelve valor alguno. Para declarar una función sin parámetros. Tema 4. Pág. 3
Para crear punteros genéricos (es decir que no apuntan a ningún tipo en particular). A excepción del tipo void, los tipos de datos básicos pueden tener varios modificadores precediéndolos. Estos modificadores los utilizaremos para alterar el significado del tipo base y así ajustarlos a nuestras necesidades en un momento determinado. Los modificadores que podemos utilizar son los que siguen: signed, unsigned, long, y short Veamos cada uno de los tipos con más detalle: Caracteres (tipo char): Las variables carácter (tipo char) contienen un único carácter y se almacenan en un byte de memoria (8 bits). En un bit se pueden almacenar dos valores (0 y 1); con dos bits se pueden almacenar 2 2 =4 valores (00, 01, 10, 11 en binario, 0, 1, 2, 3 en decimal). Con 8 bits se podrán almacenar 2 8 =256 valores diferentes (normalmente entre 0 y 255). Tema 4. Pág. 4
Números enteros (tipo int): Una variable tipo int se almacena en 2 bytes, aunque algunos compiladores utilizan 4 bytes. Con 16 bits se pueden almacenar 2 16 =65536 números enteros diferentes, del 0 al 65535 para variables sin signo, y de 32768 al 32767 para variables con signo (que pueden ser positivas y negativas), que es la opción por defecto. Este es el rango de la variables tipo int. Cuando en tiempo de ejecución se le asigna un valor a una variable que queda fuera del rango permitido (situación de overflow o valor excesivo), se produce un error en el resultado de consecuencias imprevisibles. Cuando se necesita ahorrar memoria, podemos utilizar el modificador short, para asegurarnos que sólo ocupe 2 bytes en su representación en memoria. Números enteros (tipo long): Existe la posibilidad de utilizar enteros con un rango mayor si se especifica como tipo long. El rango de un entero long puede variar según el computador o el compilador que se utilice, pero lo normal es que se utilicen 4 bytes (32 bits) para almacenarlos, por lo que se pueden representar 2 32 =4.294.967.296 números enteros diferentes. Si se utilizan números con signo, podrán representase números entre 2.147.483.648 y 2.147.483.648. También se pueden declarar enteros long que sean siempre positivos con la palabra unsigned. Números reales (tipo float): En muchas aplicaciones hacen falta variables reales, capaces de representar magnitudes que contengan una parte entera y una parte fraccionaria o decimal. Estas variables se llaman también de punto flotante. Normalmente, en base 10 y con notación científica, estas Tema 4. Pág. 5
variables se representan por medio de la mantisa, que es un número mayor o igual que 0.1 y menor que 1.0 y un exponente que representa la potencia de 10 por la que hay que multiplicar la mantisa para obtener el número considerado. Por ejemplo, π se representa como 0.3141562654 10 1. Tanto la mantisa como el exponente pueden ser positivos y negativos. Números reales (tipo double): Las variables tipo float tiene un rango y una precisión muy limitada, insuficiente para la mayor parte de los cálculos técnicos y científicos. Este problema se soluciona con el tipo double, que utiliza 8 bytes (64 bits) para almacenar una variable. 4.2.2 Variables y Constantes. Variables Como sabemos, la memoria de un ordenador consta de un conjunto enorme de palabras, en el que se almacenan datos y programas. Cada posición de memoria puede identificarse mediante un número o una dirección. No es, sin embargo, un sistema cómodo o práctico, por la nula relación mnemotécnica que una dirección de memoria suele tener con el dato contenido, y porque la dirección física de un dato cambia de ejecución a ejecución, o incluso en el transcurso de una misma ejecución del programa. Dadas las citadas dificultades para referirse a un dato por medio de su dirección en memoria, se ha hecho habitual el uso de identificadores. Un identificador es un nombre simbólico que se refiere a un dato o programa determinado, es decir, un nombre para referirse a variables, funciones, etiquetas y cualquier otro objeto definido por el usuario en un programa. El sistema se Tema 4. Pág. 6
ocupa de mantener una tabla en la que se relaciona cada identificador con el tipo de dato que representa y la posición de memoria en la que está almacenado. Los usuarios pueden elegir con gran libertad los nombres de sus variables y programas, teniendo siempre cuidado de respetar las reglas del lenguaje y de no utilizar un conjunto de palabras reservadas (keywords), que son utilizadas por el propio lenguaje. Todos los identificadores que se utilicen han de ser declarados por el usuario La longitud de un identificador puede variar entre 1 y 32 caracteres. El primer carácter debe ser una letra o un símbolo de subrayado y los caracteres siguientes pueden ser letras, números o símbolos de subrayado. El modo de almacenamiento (storage class) es otra característica de las variables de C que determina cuándo se crea una variable, cuándo deja de existir y desde dónde se puede acceder a ella, es decir, desde dónde es visible. En C existen 4 modos de almacenamiento fundamentales: auto, extern, static y register. Nos centremos en hacer uso exclusivamente del tipo auto: auto (automático): Es la opción por defecto para las variables que se declaran dentro de un bloque En C la declaración debe estar siempre al comienzo del bloque. No es necesario poner la palabra auto. No son inicializadas por defecto, y antes de que el programa les asigne un valor- pueden contener basura informática. Tema 4. Pág. 7
Constates Se entiende por constantes aquel tipo de información numérica o alfanumérica que no puede cambiar más que con una nueva compilación del programa. En el código de un programa en C pueden aparecer diversos tipos de constantes que se van a explicar a continuación. Constantes enteras: 25, -126, etc. Constantes de Punto Flotante: 23.5, -0.05, -3.8E+17 Constantes carácter: Una constante carácter es un carácter cualquiera encerrado entre apóstrofos (tal como x o t ). En C no existen constantes tipo char, lo que se llama aquí constantes carácter son en realidad constantes enteras. Cadenas de caracteres: Una cadena de caracteres es una secuencia de caracteres delimitada por comillas ( ), como por ejemplo: Esto es una cadena de caracteres. Dentro de la cadena pueden aparecer caracteres en blanco. 4.2.3 Declaración de variables Todas las variables han de ser declaradas antes de poder ser usadas (una variable no declarada producirá un mensaje de error en la compilación), y esta declaración ha de hacerse al principio del programa. Cuando una variable es declarada se le reserva memoria de acuerdo con el tipo incluido en la declaración. Es posible inicializar dar un valor inicial- las variables en el momento de la declaración. La forma general de declaración es la siguiente: [modo almacenamiento] [Modif.acceso] [Modif.tipo] <tipo> {<identificador> [= valor],...} ; Tema 4. Pág. 8
donde: modo de almacenamiento: En nuestro caso no deberemos expresar nada pues el modo auto (el que usaremos) es el modo por defecto modificadores de acceso: Constante: const, modificadores de tipo: Con signo: signed (por defecto), Sin signo: unsigned, Largo: long (doble tamaño), Corto: short (la mitad del tamaño) tipo de dato: carácter: char, Entero: int, Coma flotante: float (simple precisión), o double (doble precisión), Sin valor: void identificador: El identificador es el nombre con el que nos vamos a referir a la variable. Como vemos, podemos declararnos más de una variable de un tipo determinado en una sola sentencia, con tan solo separar los identificadores por comas (,). valor: Podemos inicializar la variable en la misma declaración. [], indican opcionalidad <>, indican obligatoriedad {}, indican que su interior se puede repetir todas las veces que queramos (al menos una) Como vemos toda declaración debe finalizar con un punto y coma (;). 4.2.4 Declaración de una constante Se puede utilizar el cualificador const en la declaración de una variable para indicar que esa variable no puede cambiar de valor. Por ejemplo Tema 4. Pág. 9
const float pi=3.141592; Se obtendrá un mensaje de error en la compilación si una variable const figura a la izquierda de un operador de asignación. Así pues, la declaración de una constante será: const <tipo> <identificador> = <valor>; Definición de constantes con la directiva define El lenguaje C también permite definir constantes mediante la directiva #define. Su sintaxis es la siguiente: #define nombre_constante expresion_constante. donde: nombre_constante es un identificador (por convenio con los caracteres en mayúsculas). expresion_constante es cualquier expresión constante válida. No puede contener variables. #define PI 3.141592 La directiva #define no es una sentencia y por tanto no termina en punto y coma. El uso de constantes en un programa puede facilitar el mantenimiento de éste. 4.3 Operaciones básicas aritmético-lógicas. Operadores y expresiones. Un operador es un carácter o grupo de caracteres que actúa sobre una, dos o más variables para realizar una determinada operación con un determinado resultado. Los operadores pueden ser unarios, binarios y ternarios, según actúen sobre uno, dos o tres operandos, respectivamente. Tema 4. Pág. 10
Una expresión es un conjunto de variables y constantes y también de otras expresiones más sencillas- relacionadas mediante distintos operadores. 4.3.1 Operación de asignación La forma general de la sentencia de asignación es la siguiente: equivalente a: <nombre de la variable> = <expresión> <nombre de la variable> operador= expresión; <nombre de la variable> = <nombre de la variable> operador expresión Ejemplo: n=n+1 Equivale a n += 1 4.3.2 Operadores aritméticos Los operadores ++, y -- son operadores unarios que incrementan o disminuyen en una unidad el valor de la variable a la que afectan. Si preceden a la variable, ésta es incrementada/decrementada antes de que el valor de dicha variable sea utilizado. En caso contrario la variable es incrementada/decrementada después de ser utilizada. Ejemplo: Tema 4. Pág. 11
i = 2; j = 2; m = i++; // m=2 e i=3 n = ++j; // n=3 y j=3 El operador % devuelve el resto de una división entera. m = 7 % 2; almacenará el valor 2. El operador % no puede aplicarse a los tipos de coma flotante. 4.3.3 Operadores relacionales Una característica imprescindible de cualquier lenguaje de programación es la de considerar alternativas, esto es, la de proceder de un modo u otro según se cumplan o no ciertas condiciones Los operadores relacionales de C son los siguientes: Operador Acción Mayor que > Mayor o igual que > = Menor que < Menor o igual que < = Igual que = = Distinto que! = Todos los operadores relacionales son operadores binarios (tienen dos operandos), y su forma general es: expresion1 op expresion2 donde op es uno de los operadores relacionales. El funcionamiento de estos operadores es el siguiente: se evalúan expresion1 y expresion2, y se comparan los valores resultantes. Si la condición representada por el operador relacional se cumple, el resultado es 1; si no se cumple, será 0. Tema 4. Pág. 12
4.3.4 Operadores lógicos Los operadores lógicos son operadores binarios (a excepción de la negación) que permiten combinar los resultados de los operadores relacionales. Operador Acción && Y O! NO La tabla de verdad de cada uno de los operadores lógicos es: p q p&&q p q!p 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 4.3.5 Expresiones. Los operadores, las constantes y las variables son los constituyentes de las expresiones. Una expresión en C es cualquier combinación válida de esos elementos. Expresiones aritméticas Expresiones lógicas 4.3.5.1 Reglas de precedencia y asociatividad El resultado de una expresión depende del orden en que se ejecutan las operaciones. Para determinar el orden de evaluación contamos con las reglas de precedencia. Además, el orden de evaluación puede modificarse por medio de paréntesis, pues siempre se realizan primero las operaciones encerradas en los paréntesis más interiores. Tema 4. Pág. 13
4.3.5.2 Conversiones de tipos en las expresiones Cuando en una expresión se mezclan constantes y variables de distintos tipos, se convierten a un tipo único. El compilador de C convierte todos los operandos al tipo del mayor operando. Esto se hace operación a operación. float double Tema 4. Pág. 14
4.3.5.3 Coherencia de tipos. Operaciones de CAST. Moldes Los tipos de datos de un lenguaje de programación y las operaciones sobre ellos pueden hacer que los lenguajes se puedan subdividir en dos conjuntos bien diferenciados. Lenguajes fuertemente tipificados Lenguajes débilmente tipificados. El lenguaje C es débilmente tipificado, pues permite asignar el resultado de una expresion sobre una variable que no sea del mismo tipo. Existen 3 tipos de conversiones de tipos a realizar en C: Conversión sin pérdida de información (de int a float) Conversiones con pérdida de información (Ej:de float a int) Conversiones con redondeo (ej: de Double a Float) En una asignación, la regla de conversión de tipos es muy fácil: el valor del lado derecho de la asignación se convierte al tipo del lado izquierdo Moldes Es posible forzar a que una expresión sea de un tipo determinado utilizando una construcción denominada molde. La forma general de un molde es: (tipo) expresión donde tipo es uno de los tipos estándar de C o uno definido por el usuario. Por ejemplo, si se quiere asegurar que la expresión x/2 se evalúe como de tipo float, se puede escribir: (float) x/2. Tema 4. Pág. 15
4.4 Operaciones básicas de entrada-salida A diferencia de otros lenguajes, C no dispone de sentencias de entrada/salida. En su lugar se utilizan funciones contenidas en la librería estándar y que forman parte integrante del lenguaje. Las funciones de entrada/salida son un conjunto de funciones, incluidas con el compilador, que permiten a un programa recibir y enviar datos al exterior. Para su utilización es necesario incluir, al comienzo del programa, el archivo stdio.h en el que están definidos sus prototipos.. 4.4.1 E/S por consola La E/S por consola se refiere a las operaciones que se producen en el teclado (entrada estandar) y la pantalla (salida estandar) del PC. Funciones para leer o escribir un carácter: getche( ): Lee un carácter del teclado haciendo eco en pantalla. La función espera hasta que se pulse una tecla. getch( ): Igual que getche() pero sin hacer eco en pantalla. putchar( ): Imprime un carácter en pantalla en la posición del cursor. Funciones para leer o escribir una cadena de caracteres: gets(): Lee una cadena de caracteres introducida por teclado. La función espera hasta que se pulse INTRO. puts(): Imprime una cadena de caracteres en pantalla. 4.4.2 E/S por consola con formato.estas funciones son printf( ), y scanf( ). El término con formato se refiere al hecho de que estas funciones lean y escriban datos en varios formatos bajo control del programador. Tema 4. Pág. 16
printf(): Imprime una cadena de datos en pantalla su utilización básica es de la forma: printf(salida1,salida2,...); donde salidax puede estar constituida por : - caracteres que se mostrarán en la pantalla. -órdenes de formato: definen la forma en que se muestran los argumentos posteriores. Una orden de formato empieza con un signo de porcentaje y va seguido por el código del formato - argumentos: expresiones compuestas por Variables o constantes. Ejemplo: printf( El valor es %i y su cuadrado es %i,j,j*j); Debe haber el mismo nº de argumentos que de órdenes de formato y deben aparecer en el mismo orden. Por ejemplo: printf( Hola %c %d %s, c, 10, qué tal! ); Formatos básicos %c carácter %d,%i decimal (entero) %e Notación científica %f decimal en punto flotante (real) %g usa %e o %f según sea más corto %s cadena de caracteres %u decimales sin signo scanf(): Es la rutina de entrada por consola de propósito general. Puede leer todos los tipos de datos que suministra el compilador y convierte los números automáticamente al Tema 4. Pág. 17
formato interno apropiado. Es el complemento de printf( ). Su utilización básica es: scanf(tipo,entrada); En la lectura que se lleva a cabo a través del scanf, se indica el tipo de dato a leer mediante los especificadores de formato, así como la variable donde almacenar la lectura (entrada). Los formatos básicos son: %c carácter %d,%i decimal (entero) %e Notación científica %f decimal en punto flotante (real) %s cadena de caracteres Todas las lecturas mediante scanf llevan asociadas la utilización el operador &(dirección) precediendo a la variable donde se lee, excepto en las lecturas de cadenas de caracteres. Ejemplos: scanf( %c,&h); scanf( %i,&i); scanf/ %s,t); 4.4.2.1 Constantes de carácter con barra invertida Para escribir en pantalla ciertos caracteres especiales hemos de utilizar una serie de constantes especiales: Código Significado Código Significado \b Espacio atrás \ Comilla simple \f Salto de página \0 Nulo \n Salto de línea \\ Barra invertida \r Retorno de carro \v Tabulación vertical Tema 4. Pág. 18
\t Tabulación horizontal \a Alerta \ Comillas dobles \o Constante octal \x Constante hexadecimal 4.5 Ejemplo: Nuestro primer programa Programa que calcula la edad del usuario, pidiéndole previamente el año en el que ha nacido: #include <stdio.h> /* librería para las funciones clrscr(), printf() y scanf() */ int main( ) { int agno, edad, actual; /* declaramos las variables indicando su tipo */ clrscr(); /* antes que nada, borraremos la pantalla */ printf( Hola, en qué año naciste? ); scanf( %i, &agno); /* la vble. agno contiene el año de nacimiento */ printf( Puedes hacerme el favor de indicarme en qué año estamos ); scanf( %i, &actual); curso */ edad=actual-agno; /* calculamos la edad */ /* la vble. actual contiene el año en printf( Como consecuencia de estar en el año %i y haber nacido en el año %i, tienes la friolera de %i años., actual, agno, edad); } return 0; Tema 4. Pág. 19
APENDICE: La Biblioteca estándar de C Debido a que el C tiene muy pocas palabras clave, tiene que suplir esta carencia con una serie de funciones, agrupadas en unas librerías (cada librería contiene un determinado número de funciones que realizan acciones de un carácter específico), a cuyo conjunto se le llama Biblioteca. Para poder utilizar una determinada librería hay que incluir su archivo de cabecera, al principio de nuestro programa: #include <nombre archivo cabecera>. Los principales archivos de cabecera estándar son: Archivo Propósito ALLOC.H Funciones de asignación dinámica (ANSI C) CONIO.H Funciones de manejo de pantalla CTYPE.H Funciones de manejo de caracteres (ANSI C) DIR.H DOS.H GRAPHICS.H IO.H MATH.H STDIO.H Funciones de manejo de directorio Funciones de interfaz con el DOS Funciones de gráficos Rutinas de E/S de tipo UNIX Definiciones usadas por la biblioteca matemática (ANSI C) Definiciones y declaraciones para secuencias de E/S estándar STDLIB.H Declaraciones variadas (ANSI C) STRING.H Soporte a las funciones de cadena (ANSI C) TIME.H Soporte a las funciones de tiempo del sistema (ANSI C) Tema 4. Pág. 20
Tabla Códigos Ascii Tema 4. Pág. 21