Fundamentos de Informática I ETSII Tema 1: Introducción a C. Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia Tema 1: Introducción a C Índice: Objetivos Conceptos previos Tipos de datos, variables y constantes. Comentarios. Operadores y expresiones Estructura de un programa en C Trazas 1
Tema 1: Introducción a C Objetivos Conocer los operadores básicos de C Conocer los tipos de datos Manejar un entorno de desarrollo (prácticas) C Creado por Dennis Ritchie (laboratorios Bell, 1972). Herramienta para programadores (su primer objetivo es ser útil). Genera un código eficiente y rápido. El código de C es portable. Flexible y potente: C combina elementos de los lenguajes de alto nivel con otros propios de ensamblador. No impone restricciones a la hora de programar. Es un lenguaje estructurado: funciones, estructuras, bucles,... 2
Estructura de un programa en C main: indica donde empezar a ejecutar el código void main ( ) { instrucción 1; instrucción 2; instrucción n; } Las instrucciones deben finalizar con ;. {... }: delimitan un conjunto de instrucciones Estructura de un programa en C void main ( ) {. } int main ( ) {. return 0; } 3
Estructura de un programa en C Cabecera Cuerpo /* Instrucciones de preprocesador */ /* Variables globales */ void main() { /* Declaraciones de variables locales */... /* Entrada de datos */... /* Proceso */... /* Salida de datos: resultados */... } Ejemplo Inclusión de ficheros Declaraciones de constantes, macros,... #include <stdio.h> #define nombre Pepito Variables globales int i = 7; void main () Inicio de programa { int n; Variables locales /* Este es un programa tonto */ n = 25; Instrucción de asignación printf( Hola %s, soy el número %d y yo el %d.\n, nombre, n, i); } Fin de programa Programa principal Comentario Instrucción de salida (escritura) 4
Estructura de un programa en C Comentarios Añade legibilidad al código fuente Facilita la comprensión posterior por el propio programador y por otros (trabajo en equipo) Inserta información adicional de cualquier tipo No influye en absoluto sobre el rendimiento final del programa generado Ejemplo int i; Cerrar comentario /* Se utilizará como contador en el bucle principal */ Abrir comentario 5
Identificadores y palabras reservadas Identificador: nombre dado a un elemento del programa (constantes, variables y funciones). Reglas para construir un identificador : Deben comenzar por letra (a..z o A..Z) o subrayado (_). El resto del identificador puede constar de letras, dígitos numéricos o subrayado. Se distinguen mayúsculas y minúsculas. Pueden tener hasta 32 caracteres (dependiendo del compilador). No pueden coincidir con las palabras reservadas del lenguaje. Palabras reservadas: identificadores que tienen un significado predefinido dentro del lenguaje (main, int,...). Variables y constantes Sirven para almacenar datos (información) durante la ejecución del programa. Variable: simbología que nos permite asociar un nombre a un almacén de información temporal en un programa. Esta información puede variar durante la ejecución. Constante: lo mismo que la variable pero su contenido permanece constante. 6
Declaración de variables tipo_de_datos variable1 [=valor1] [, variable2 [= valor2] ]; Reservar memoria para almacenar los datos durante la ejecución de un programa. Asignar a un identificador un tipo de datos. Permite la utilización posterior por el programa de la información almacenada en la variable. No se le da ningún valor. Ejemplo: int contador; unsigned int edad=88; char sexo= H, letra1, letra2; float f=6.99; Inicialización de variables Declaración int a, b, c; float f=2.4, g=0.0; char d, e = k ; Valores de Variables a=indeterminado b=indeterminado c=indeterminado f=2.4 g=0.0 d=indeterminado e= k 7
Asignación de variables variable = expresión; Asigna el resultado de evaluar la expresión a la variable. El valor anterior de la variable se pierde Ejemplo: int a,b,c; int d,e; a = 5; b = 6; c = b+a-4; Declaración Asignación Tipos de variables (ámbito) Variables locales: son visibles únicamente en la función donde se declaran. Se crean cuando se ejecuta la función y se destruyen al finalizar ésta. Variables globales: visibles por todas las funciones del programa. Se declaran antes de la función main. Perduran durante toda la ejecución del programa. 8
Ejemplo /* Variables globales */ int j=5, k; int main() { /* Variables locales */ int i; char c= p ; int valor=899; /* Instrucciones */... return 0; } Constantes La información que tiene una constante no varía, por lo que se suelen utilizar para definir valores que se repiten a lo largo del programa (sentencia de preprocesador): #define nombre_constante valor_constante #define pi 3.14159 #define titulo TEXTO FIJO #define numero_alumnos 100 9
Constantes Las tiras de caracteres (frases) entre comillas dobles ( hola, 999 ). Se sitúan delante del programa principal Se distinguen mayúsculas y minúsculas #define nombre Pepito Grillo #define c a #define Mi_Inicial z #define mi_inicial I #define valor 3.677 #define j 5 Los caracteres deben ir entre comillas simples ( a, 9 ) Tipos de datos El ordenador debe tener un patrón para interpretar las secuencias de bits. Todos los datos deben tener un tipo de dato asociado. Definen: Longitud del dato (valores máximo y mínimo). Operaciones que se puede realizar con ese dato. Conjunto de valores posibles. Clasificación: Simples. Estructurados: compuestos de otros tipos de datos simples o estructurados. 10
Tipos de datos: entero (int) Es un subconjunto finito de los números enteros con signo. Declaración: int variable1 [= valor1] [, variable2 [= valor2] ]; Ejemplo: int i, j=7; int mivalor=2224, mi_numero; Tipos de datos: entero (int) Tamaño: depende del número de bytes que el compilador/procesador utiliza. Matizaciones de tipo: short, long, unsigned. Tipo int short int long int unsigned int Palabra 16 bits 16 bits 16 bits 32 bits 16 bits Palabra 32 bits 32 bits 16 bits 32 bits 32 bits 11
Tipos de datos: entero (int) int unsigned int long int unsigned long int Bits 16 bits 16 bits 32 bits 32 bits Rango [-32.768.. 32.767] [0.. 65.536] [-2.147.483.648.. 2.147.483.647] [0.. 4.294.967.296] Tipos de datos: entero (int) Operaciones Aritméticas: + - * / % (5/2 2 5%2 1) Comparación: >, >=, <, <=, ==,!= Resultado: 0 (falso) ó 1 (cierto). 12
Tipos de datos: real (float, double) Subconjunto de los reales con signo (racionales: cociente de dos números enteros, al disponer de un número limitado de bits). Declaración: float variable [= valor1] [, variable [= valor] ]; double variable [= valor1] [, variable [= valor] ]; Ejemplo: float v1=3.7, v2 ; double v3 ; Tipos de datos: real (float, double) La diferencia entre float y double es su tamaño. Tipo float double Palabra 16 bits 32 bits 64 bits Palabra 32 bits 32 bits 64 bits 13
Tipos de datos: real (float, double) Operaciones Aritméticas: + - * / (división real, algún componente real) Comparación: >, >=, <, <=, ==,!= Resultado: 0 (falso) o 1 (cierto). Tipos de datos: carácter (char) Conjunto finito y ordenado de caracteres que el ordenador es capaz de reconocer. Contiene un solo carácter. Un carácter se almacena como un valor entero de 8 bits. El ordenador interpreta este código en función de unas tablas de conversión (código ASCII). Se representan ente comillas simples: A. 14
Tipos de datos: carácter (char) Caracteres: Alfabéticos: a..z, A..Z Numéricos: 0..9 Especiales: +, -, *, /, <,... Contiene los caracteres no imprimibles (retorno de carro, fin de cadena,...). \n Nueva línea \t Tabulado \b Retroceso \r Retorno de carro \f Salto de página \\ Barra atrás (\) \ Apóstrofe ( ) \ Comillas ( ) Tipos de datos: carácter (char) Declaración: char variable1 [= valor1 ] [, variable2 [= valor2 ] ]; Ejemplo: char c= +, caracter; char c2= 0, c3= \n ; char c4= 2, c5=2; char c1=65; 15
Tipos de datos: carácter (char) Operaciones Aritméticas: + - * / % (división entera) Comparación: >, >=, <, <=, ==,!= Resultado: 0 (falso) o 1 (cierto). Tipos de datos: carácter (char) Tabla ASCII: caracteres de control no imprimibles 16
Tipos de datos: carácter (char) Tabla ASCII: caracteres imprimibles Tipos de datos: carácter (char) Tabla ASCII: caracteres extendidos imprimibles 17
Ejemplo char c=10; int i; c=c-1; i=c; c=i; i = A > B ; c= A +35; Tabla ASCII: toma como valor del carácter la posición en la tabla ASCII. i 0 (falso) Ejemplo char a=0, b, c, d, e; b = a; c = a ; d = ab ; e = \n ; b 0 c 97 (la letra a está en la posición 97 de la tabla ASCII) Error: ab no es un carácter (son dos). Dará un error en compilación. No es un error: un solo carácter especial. 18
Expresiones Expresión: colección de operandos unidos por operadores, para construir una formula algebraica que representa un valor (un dato simple). Tipos de expresiones: Aritméticas: resultado y operandos numéricos. Relacionales: resultado entero (cierto o falso), operandos de cualquier tipo Lógicas: operandos expresiones, resultado de tipo int. Expresiones: reglas básicas Una constante, una variable y una llamada a función (términos) es una expresión (ejemplo: 33, -2, 5.78, n, a ). Una secuencia de términos separada por operandos es una expresión ( 3*4+5, n>5). No es válido poner un operador seguido de otro, usar paréntesis (10 / -3 10 / (-3)). Nunca debe omitirse el signo de multiplicación (2n 2*n). En las expresiones lógicas, la expresión puede ir precedida por el operador! (negación). En las expresiones aritméticas debe haber consistencia de tipos. En cada tipo de expresión debe utilizarse los operadores válidos para los tipos de datos que componen la expresión. 19
Expresiones aritméticas Son expresiones matemáticas. Operandos: numéricos (enteros o reales). Operadores: aritméticos (+ - * / % ++ --). Resultado: numérico. El resultado de la división es diferente dependiendo del tipo de los operandos (entero o real). Expresiones aritméticas Operador - + * / % -- ++ Acción Resta o menos unario Suma Multiplicación División División módulo (resto de la división entera) Decremento en 1 (unario) Incremento en 1 (unario) Tipos de Datos int, float, double, char int, float, double, char int, float, double, char int, float, double, char int, char int, char int, char 20
Expresiones aritméticas: operadores unarios Necesitan un único valor numérico para realizar la operación. Signo negativo (-): Indica que el valor numérico que sigue es un valor negativo. Ejemplo: int i=-10; Incremento (++): Se utiliza para aumentar el valor de su operando en una unidad. Ejemplo: int i=0 ; i++; La variable "i" contendrá el valor 1 Decremento (--): Se utiliza para disminuir el valor de su operando en una unidad. Ejemplo: int i=0 ; i--; La variable i contendrá el valor -1 Expresiones aritméticas: operadores unarios ++ y Operador prefijo: precede al operando (--x, ++x). Operador sufijo: detrás del operando (x--, x++). Cuando estos operadores se usan instrucción aislada tiene el mismo efecto: en una ++x; x++; --x; x--; Cuando se usan en una expresión: Operador prefijo: primero el decremento o incremento y después se opera con el resultado. Operador sufijo: primero se evalúa la expresión y después se realiza el decremento o incremento. 21
Expresiones aritméticas: operadores unarios ++ y int X=5, Y=5, K, M; K = --X; K=4 X=4 M = Y--; M=5 Y=4 Expresiones aritméticas: operadores binarios Necesitan dos valores numéricos para realizar la operación. Suma (+): Se utiliza para sumar dos valores numéricos. Ejemplo: int i=0, j=10, k = 7; i=j+k; Resta (-): Se utiliza para restar dos valores numéricos. Ejemplo: int i=0, j=10, k = 7 ; i=j-k; Multiplicación (*): Se utiliza para multiplicar dos valores numéricos. Ejemplo: int i=0, j=10, k = 7 ; i=j*k; 22
Expresiones aritméticas: operadores binarios División (/): Divide dos valores numéricos. Dependiendo del tipo de datos (entero/real) la división obtendrá decimales o no. Ejemplo: int i=0, j=10, k = 7 ; i=j/k; Resto módulo (%): Obtiene el resto de la división entera dos valores numéricos. Los operandos deben ser necesariamente números enteros. Ejemplo: int i=0, j=10, k = 7 ; i=j+k; Reducidos (+=, -=, *=, /=): Simplifican las expresiones en las que la variable a la izquierda del igual también aparece a la derecha. Ejemplo: int i=10; i+=2; Expresiones aritméticas: operadores reducidos += -= *= /= %= ++ -- incrementa el valor de una variable en un valor determinado decrementa el valor de una variable en un valor determinado multiplica el valor de una variable por un valor determinado divide el valor de una variable por un valor determinado calcula el resto de la división autoincremento (en 1, sólo para enteros y char) autoincremento (en 1, sólo para enteros y char) x = x + 10; Es equivalente a x += 10; x = x 10; Es equivalente a x -= 10; 23
Expresiones aritméticas: precedencia de operadores 3*2+5*3 Valor? 6+15=21 3*7*3=21*3=63 Las operaciones entre paréntesis se evalúan primero. Si hay paréntesis anidados se evalúa primero el más interno. Los operadores se evalúan según las reglas de precedencia. Dentro del mismo orden de precedencia se evalúa de izquierda a derecha. Expresiones aritméticas: precedencia de operadores Máxima ++ -- - (unario) * / % Mínima + - 24
Ejemplo int a, b=5, c=2, d=3, e=6; a=d*b/2; /*a = 3*5/2 = 15/2 = 7*/ a=d*(b/2); /*a = 3*(5/2) = 3*2 = 6*/ a=d+e*b/2; /*a = 3+6*5/2 = 3+30/2 = 3+15 = 18*/ a=(d+e)*b/2; /*a = (3+6)*5/2 = 9*5/2 = 45/2 = 22*/ Ejemplo int main() { int a, b, c; a=2; b=3; c=b/a+5; printf( Resultado: %d\n,c); return 1; } 3/2+5 = 1+5 = 6 25
Ejemplo void main() 1-2/3*4 = 1-0*4 = 1 { int a, b, c, d, r1, r2; a=1; b=2; c=3; (1-2)/(3*4) = -1/(3*4) = d=4; -1/12 = 0 r1=a-b/c*d; r2=(a-b)/(c*d); printf( r1:%d r2:%d\n,r1,r2); } Expresiones relacionales Relación de unos valores con otros. Operandos: cualquiera. Operadores: comparación. (>, >=, <, >=, ==,!= ) Resultado: Cierto <> 0(1) Falso 0 26
Expresiones relacionales: operadores Operador Acción > Mayor que >= Mayor o igual que < Menor que <= Menor o igual que == Igual!= Distinto Expresiones relacionales: operadores Menor que (<): devuelve verdadero si el primer operando es estrictamente menor que el segundo operando. Ejemplo: int i=7, j=10; i<j es verdadero Menor o igual que (<=): devuelve verdadero si el primer operando es menor o igual que el segundo operando. Ejemplo: int i=7, j=10, k=10; i<=j es verdadero j<=k es verdadero Mayor que (>): devuelve verdadero si el primer operando es estrictamente mayor que el segundo operando. Ejemplo: int i=7, j=10; j>i es verdadero 27
Expresiones relacionales: operadores Mayor o igual que (>=): devuelve verdadero si el primer operando es estrictamente mayor o igual que el segundo operando. Ejemplo: int i=7, j=10, k=10; j>=i es verdadero j>=k es verdadero Igual (==): devuelve verdadero si el primer operando es estrictamente igual que el segundo operando. Ejemplo: int i=7, j=7, k=10; i==j es verdadero i==k es falso Distinto (!=): devuelve verdadero si el primer operando es estrictamente distinto del segundo operando. Ejemplo: int i=7, j=7, k=10; i!=k es verdadero i!=j es falso Expresiones relacionales: precedencia de operadores Máxima Mínima > >= < <= ==!= 28
Ejemplo void main() { S == C 0 (falso) int a, b, r1, r2; char c; a = 1; b = 2; c = S ; r1 = c == C ; 2 >=1 1 (cierto) r2 = b >= a; printf( r1:%d r2:%d\n,r1,r2); } Expresiones lógicas Expresiones relacionales conectadas entre sí. Operandos: expresiones relacionales.. Operadores: comparación (&&,,! ). Resultado: retornan < >0 (cierto) y 0 (falso), entero o real. 29
Expresiones lógicas: operadores Operador Acción && And ( y lógico) la expresión es cierta si ambos operandos son ciertos Or ( o lógico) la expresión es cierta si cualquier operando es cierto.! Not ( no lógico) operando prefijo, niega un operando booleano Expresiones lógicas: operadores Y (&&): devuelve verdadero si se cumplen simultáneamente las dos condiciones o expresiones lógicas que se proporcionan como operandos. Ejemplo: int i=7, j=10, k=15; ((i < j) && (i < k)) es cierto ((i < j) && (i > k)) es falso O ( ): devuelve verdadero si se cumple al menos una de las dos condiciones o expresiones lógicas que se proporcionan como operandos. Ejemplo: int i=12, j=10, k=15; ((i < j) (i < k)) es cierto NO (!): devuelve el valor contrario del que representa su único operando. Ejemplo: int i=7, j=10;! (i < j) es falso! (i == j) es verdadero 30
Expresiones lógicas: tabla de verdad A B A && B A B!A 1 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 Expresiones lógicas: precedencia de operadores Máxima! && Mínima 31
Resumen de operadores Tipo expresión Operandos Operadores Resultado Aritméticas Numéricos (enteros o reales) + - * / % ++ -- Numérico Relacionales Numéricos y carácter < <= > >= ==!= <>0 ó 0 Lógicas Numéricos, carácter y expresiones &&! <>0 ó 0 Resumen de precedencia de operadores Máxima Mínima! ++ -- * / % + - > >= < <= ==!= && Para evitar que los operadores se evalúen con esta preferencia se usan paréntesis. 32
Ejercicio Expresiones aritméticas 6/8 3.2/0.4-11%3 (3+2)*(1+1) (i*3)+(i*2) Expresiones relacionales (i<2) (i<=2) (i*3)>=(1+2)*i (2+i)!=(1+i) Resultado Resultado Evaluar las siguientes expresiones, suponiendo que i=2 Ejercicio Expresiones aritméticas 6/8 3.2/0.4-11%3 (3+2)*(1+1) (i*3)+(i*2) Expresiones relacionales (i<2) (i<=2) (i*3)>=(1+2)*i (2+i)!=(1+i) Resultado 0 8.0 3.84 10 10 Resultado FALSO VERDADERO VERDADERO FALSO i=2 33
Ejercicio Expresiones aritméticas 6/8 3.2/0.4-11%3 (3+2)*(1+1) (i*3)+(i*2) Expresiones relacionales (i<2) (i<=2) (i*3)>=(1+2)*i (2+i)!=(1+i) Resultado Resultado Evaluar las siguientes expresiones, suponiendo que i=2 Ejercicio Expresiones aritméticas 6/8 3.2/0.4-11%3 (3+2)*(1+1) (i*3)+(i*2) Expresiones relacionales (i<2) (i<=2) (i*3)>=(1+2)*i (2+i)!=(1+i) Resultado 0 8.0-2 10 10 Resultado FALSO VERDADERO VERDADERO VERDADERO i=2 34
Ejercicio Expresiones lógicas (i<2) O (i<10) (7>=6) Y (3= =3) No (i<1) ((i<1) O (i*2>1)) Y (i>1) En C (i<2) (i<10) (7>=6) && (3= =3)!(i<1) ((i<1) (i*2>1)) && (i>1) Resultado Evaluar las siguientes expresiones, suponiendo que i=2 Ejercicio Expresiones lógicas (i<2) O (i<10) (7>=6) Y (3= =3) No (i<1) ((i<1) O (i*2>1)) Y (i>1) En C (i<2) (i<10) (7>=6) && (3= =3)!(i<1) ((i<1) (i*2>1)) && (i>1) Resultado VERDADERO VERDADERO VERDADERO VERDADERO i=2 35
Traza: estado de un programa Tabla que muestra el cambio de estado de un programa en el tiempo (valor de todas las variables utilizadas, paso a paso). void main() a b c d {???? int a=6,b=5,c,d; 6 5?? c=a+b; 6 5 11? b+=5; 6 10 11? d=c*(a-b)+4; 6 10 11-40 } Tipos de instrucciones o sentencias 1. Instrucción de declaración 2. Instrucción de asignación 3. Instrucción de función 4. Instrucción condicionales 5. Bucles 6. Comentarios 7. Instrucción compuesta o bloque 36
Tipos de instrucciones o sentencias Instrucción de declaración: declaran variables. Se puede dar un valor inicial a la variable. int i, j; Instrucción de asignación: sirve para asignar valores a las variables. x = 234; y = -8; a = x * 2 + y / 5; Tipos de instrucciones o sentencias Instrucción de función: llaman a alguna función, que se encarga de realizar las acciones que tiene asignadas. Las funciones pueden retornar valores, por lo que la sentencia puede implicar una asignación. printf( Hola ); a = suma(x, y); Instrucción condicionales: permiten ejecutar unas instrucciones u otras en función de una determinada condición. Son if y switch. 37
Tipos de instrucciones o sentencias Bucles: repiten un grupo de instrucciones un número determinado de veces. Son while, do-while y for. Comentarios: instrucciones que no se ejecutan. Sirven para poner notas a un programa. /* Esto es un comentario */ Instrucción compuesta o bloque: conjunto de instrucciones encerradas entre llaves. Instrucción de asignación variable = expresión; Evalúa la expresión y deja su valor en la memoria reservada para la variable. Destructiva: el valor que contenía la variable desaparece. La parte izquierda únicamente puede ser una variable. Ejemplo: a = b+3; a = 77; a + b = 55; INCORRECTO 38
Ejemplo: intercambio de variables void main() { int aux, a, b; a=10; b=20; aux=a; a=b; b=aux; } a basura 10 10 10 20 20 b basura basura 20 20 20 10 aux basura basura basura 10 10 10 Ejemplo int a = 3, b = 7; a++; b += 2; b += ++a; b += a++; a=4 b=7 a=4 b=9 a=5 b=14 a=6 b=19 39