Tema 9. Vectores y Matrices



Documentos relacionados
Introducción al tipo de dato ARRAY

Arrays y Cadenas en C

Modulo 1 El lenguaje Java

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Vectores. 27/05/05 Programación Digital I 1

7. Manejo de Archivos en C.

Introducción a la programación orientada a objetos

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

Capítulo 4. Vectores y matrices. 4.1 Declaración de tablas. 4.2 Declaración estática de tablas

TIPOS DE DATOS DEFINIDOS POR EL PROGRAMADOR: Estructuras CONTENIDOS

Ejercicio 1 (2 puntos. Tiempo: 25 minutos)

Preliminares. Tipos de variables y Expresiones

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Vectores y matrices. Arrays Declaración Creación Acceso a los elementos de un array Manipulación de vectores y matrices

Contenidos. Funciones (suplemento) Funciones. Justificación del uso de Funciones

Academia técnica de computación A.T.C.

FUNDAMENTOS DE INFORMÁTICA 1º Ingeniería Industrial

ESTRUCTURA DE DATOS: ARREGLOS

ARREGLOS DEFINICION GENERAL DE ARREGLO

Tema 5 Sentencias de control de flujo. Fundamentos de Informática

Se guardan en archivos con extencion c y los cabezales con extension h

LAS BARRAS. La barra de acceso rápido

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

11. Algunas clases estándar de Java (II)

Tema 7 Vectores y cadenas de caracteres. Fundamentos de Informática

GESTINLIB GESTIÓN PARA LIBRERÍAS, PAPELERÍAS Y KIOSCOS DESCRIPCIÓN DEL MÓDULO DE KIOSCOS

LABORATORIO 1 OPERACIONES DE ENTRADA Y SALIDA

Sintaxis y Convenciones de Java. M. en C. Erika Vilches

Para crear una lista como la anterior, primero escribe la información, y después selecciona el texto y aplícale el formato de viñetas.

SOLUCION EXAMEN junio 2006

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

promedio = nint((notas(1) + notas(2) + notas(3) + & notas(4) + notas(5) + notas(6)) / 6.0) print *, 'Su promedio es', promedio

AUTOR CARLOS EDUARDO BUENO VERGARA JORGE ARMANDO BUENO VERGARA USO DE LOS OBJETOS DEL PROGRAMA. Dfd INFORMÁTICA II PROFESOR. JOSÉ FRANCISCO AMADOR

A25. Informática aplicada a la gestión Curso 2005/2006 Excel Tema 7. Funciones avanzadas de Excel II

Bases de datos en Excel

El e-commerce de Grupo JAB es una herramienta que permite a los clientes del Grupo, realizar un amplio conjunto de servicios de consulta, petición y

3.1. Guardar un libro de trabajo

Universidad de Pamplona Materia: Programación 1 Docente: Ing. Lusbin Raúl Vargas LENGUAJE C ESTRUCTURA DE UN PROGRAMA EN C

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Manual de Procedimiento

MICROSOFT EXCEL Introducción: Qué es y para qué sirve Excel2007? TECNOLOGIA/ INFORMATICA: MS-EXCEL

!!!!!!!! !!!!! Práctica!4.! Programación!básica!en!C.! ! Grado!en!Ingeniería!!en!Electrónica!y!Automática!Industrial! ! Curso!2015H2016!

TEMA 2 WINDOWS XP Lección 4 BLOC DE NOTAS

Combinar correspondencia (I)

Operación Microsoft Access 97

Examen Principios de Programación Febrero 2012

Uso del Programa Gantt Project

by Tim Tran:

Práctica 2: Simón dice

Herramientas computacionales para la matemática MATLAB: Otros tipos de datos

TEMA 3: EL LENGUAJE C: PRESENTACIÓN

Anexo B. Comunicaciones entre mc y PC

Cómo creo las bandejas del Registro de Entrada /Salida y de Gestión de Expedientes?

Contenidos. Archivos en C++ Archivos en C++ Introducción

PS.Vending Almacén Pocket PC

FACULTAD DE INGENIERÍA

Creación y administración de grupos de dominio

Centro de Capacitación en Informática

Informática I. While & do While

Tema 2: La clase string

Cifras significativas e incertidumbre en las mediciones

Reservas - Rooming List

1. DML. Las subconsultas

Programación. Ejercicios Tema 4 Estructuras de Control Repetitivas

INFORMÁTICA. Práctica 5. Programación en C. Grado en Ingeniería en Electrónica y Automática Industrial. Curso v1.0 (05.03.

Una variable de clase escalar tiene un nivel de indirección igual a 1. Por ejemplo, las variables i, b y x definidas como se muestra a continuación.

ORGANIZAR LA INFORMACIÓN: EL EXPLORADOR DE WINDOWS

TEMA 1: SISTEMAS INFORMÁTICOS. Parte 2: representación de la información

Ejemplos de conversión de reales a enteros

EJERCICIOS DE PROGRAMACIÓN RELACIÓN VII (EJERCICIOS DE REPASO)

Prof. Dr. Paul Bustamante

Operación de Microsoft Word

Para crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas.

efactura Online La fibra no tiene competencia

Herramientas computacionales para la matemática MATLAB: Scripts

PRACTICA 6. VECTORES Y MATRICES.

Tutorial Básico de vbscript

2.1.- EJEMPLO DE UN PROGRAMA FORTRAN

Curso PHP Módulo 1 R-Luis

PHP y MySQL. Indice: Switch Bucles For While do...while

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Funciones en C. En esta unidad aprenderás a: Comprender el desarrollo de un programa utilizando funciones

TEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ;

BASES DE DATOS - Microsoft ACCESS 2007-

TécniquesInformàtiques PRÀCTICA 6 (2 Sessions) Curs

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

CURSO DE INTRODUCCIÓN AL WORD

CONCEPTOS BASICOS. Febrero 2003 Página - 1/10

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Las propiedades de la clase en java es el equivalente a las variables globales en lenguajes estructurados como el C.

Indicaciones específicas para los análisis estadísticos.

15 CORREO WEB CORREO WEB

Transcripción:

Tema 9. Vectores y Matrices OBJETIVO En temas anteriores hemos declarado variables simples de tipo int, float, o de cualquier otro tipo simple. A menudo necesitaremos declarar una colección de variables, tales como 20 enteros. En este tema veremos cómo podemos declarar arrays vectores y matrices, que reciben el nombre genérico de arrays. Por otro lado, C no tiene datos predefinidos tipo cadena. En su lugar, C manipula cadenas de caracteres mediante arrays de caracteres que terminan con el carácter nulo ASCII ('\0'). Una cadena se considera como un vector de tipo char o unsigned char. Bibliografía Joyanes Aguilar, J. Programación en C++. Algoritmos, estructuras de datos y Objetos. Capítulos 7 y 9. Ed. McGraw-Hill. Pont, M.J. Software Engineering with C++ and CASE Tools. Capítulo 7. Pointers and arrays. Ed. Addison-Wesley. CONTENIDOS 1. Qué es un Array? 1 1.1. Elementos de un Array 2 1.2. Declaración de arrays 3 1.3. Asignación de valores fuera del array 4 1.4. Inicialización de un array 6 2. Matrices (arrays multidimensionales) 6 2.1. Inicialización de arrays multidimensionales 7 3. Cadena de caracteres 9 3.1. Lectura de cadenas 10 3.2. Manejo de cadenas 11 1. Qué es un Array? Un array es una colección de posiciones de almacenamiento de datos, todos ellas con el mismo tipo de dato. Cada posición de almacenamiento se denomina elemento del array. Denominaremos vector a un array unidimensional, y matriz a un array multidimensional. Para declarar un vector escribimos el tipo de dato, seguido del nombre del vector y del subíndice. El subíndice es el número de elementos del vector, encerrado entre corchetes. Por ejemplo, long vectorlargo[25]; declara un vector de 25 enteros largos, llamado vectorlargo. Cuando el compilador encuentra esta declaración reserva la memoria necesaria para los 25 elementos. Puesto que cada entero necesita 4 bytes, esta declaración reserva 100 bytes contiguos de memoria, como se ilustra en la figura 9.1.

Vectores y Matrices 2 Figure 9.1. Declaración de un vector. 1.1. Elementos de un vector Para acceder a los elementos del vector debemos tomar como base el nombre del vector. Los elementos del vector de cuentan a partir de cero, por tanto el primer elemento es NombreVector[0]. En el ejemplo anterior, VectorLargo[0] es el primer elemento del vector VectorLargo, VectorLargo[1] el segundo y así sucesivamente. Esto puede resultar confuso. El vector Vector[3] tiene tres elementos: Vector[0], Vector[1] y Vector[2]. En general, Vector[n] tiene n elementos, que van desde el Vector[0] hasta el Vector[n- 1]. Por lo tanto, VectorLargo[25] se numera desde VectorLargo[0] hasta VectorLargo[25]. El listado 9.1 muestra cómo declarar un vector de 5 enteros e inicializarlos con un valor. Programa 9.1: Uso de un vector entero 1: // Listado 9.1: Vectors 2: #include <stdio.h> 3: 4: int main() 5: { 6: int Vector1[5]; 7: int i; 8: for ( i=0; i<5; i++) // 0-4 9: { 10: printf("valor para Vector1[%d]: ", i); 11: scanf("%d", &Vector1[i]); 12: } 13: for (i = 0; i<5; i++) 14: printf("%d: %d\n", i, Vector1[i]); 15: return 0; 16: } Salida Valor para Vector1[0]: 1 Valor para Vector1[1]: 2 Valor para Vector1[2]: 3 Valor para Vector1[3]: 4 Valor para Vector1[4]: 5 0: 1 1: 2

Vectores y Matrices 3 2: 3 3: 4 4: 5 Análisis: La línea 6 declara un vector llamado Vector1, que contiene cinco variables enteras. La línea 8 establece un bucle que cuenta de 0 a 4, que es el adecuado conjunto de desplazamientos para un vector de cinco elementos. Los sucesivos valores introducidos por el usuario son asignados a los correspondientes elementos del vector. El segundo bucle imprime cada uno de los valores del vector en la pantalla. NOTA: los vectores cuentan desde 0, no desde 1. Este es el origen de muchos errores en programas C escritos por principiantes. Siempre que utilices un vector, recuerda que un vector con 10 elementos cuenta desde NombreVector[0] hasta NombreVector[9]. NombreVector[10] no se usa. 1.2. Declaración de vectores Un vector puede tener cualquier nombre que cumpla los requisitos para ser nombre o identificador de una variable, pero no puede tener el mismo nombre que otra variable o vector del mismo ámbito. Por lo tanto, no podemos tener un vector llamado Tabla[5] y una variable llamada Tabla al mismo tiempo. Podemos dimensionar el tamaño de un vector con una constante o con una enumeración. El listado 9.2 ilustra este hecho. Programa 9.2: Uso de constantes y enumeraciones en arrays 1: // Listado 9.2 2: // Dimensionado de vectores con constantes y enumeraciones 3: 4: #include <stdio.h> 5: int main() 6: { 7: enum DiasSemana { Lunes, Martes, Miercoles, Jueves, 8: Viernes, Sabado, Domingo, DiasEnSemana }; 9: int ArraySemana[DiasEnSemana] = { 10, 20, 30, 40, 50, 60, 70 }; 10: 11: printf("el valor en viernes es: %d", ArraySemana[Viernes]); 12: return 0; 13: } Salida El valor en viernes es: 50 Análisis: La línea 7 crea una enumeración llamada DiasSemana que tiene ocho miembros. Lunes es igual a cero, y DiasEnSemana es igual a 7.

Vectores y Matrices 4 La línea 11 usa la constante enumerada viernes como índice del vector. Puesto que viernes vale 4, el quinto elemento del vector, ArraySemana[4] se imprime en pantalla. 1.3. Asignación de valores fuera del vector Cuando asignamos un valor a un elemento de un vector, el compilador calcula la posición de memoria donde tiene que almacenar dicho valor a partir del subíndice. Supongamos que queremos asignar un valor a ArrayLargo[5], que es el sexto elemento del vector. El compilador multiplica el subíndice (5) por el tamaño del dato (int = 4 bytes). Después se desplaza desde el principio del vector tantos bytes como indique el resultado de la multiplicación anterior (20), y escribe el nuevo valor en esa posición. Si tenemos suerte, el programa fallará inmediatamente. Si queremos asignar un valor a ArrayLargo[50], el compilador ignora el hecho de que dicho elemento no existe. Solamente calcula el desplazamiento a realizar desde el primer elemento (200 bytes) y escribe el valor en dicha posición. Esta posición puede estar reservada para otra variable, y escribir un valor en dicha posición puede tener resultados imprevistos. Si no es así, es posible que el programa falle más adelante, y será difícil determinar el por qué ha fallado. El compilador actúa como un ciego que cuenta por pasos la distancia desde una casa. Comienza en la primera casa, PaseoZorrilla[0]. Cuando le pedimos que vaya a la sexta casa del Paseo Zorrilla, él se dice: Debo ir cinco casas más allá. Cada casa mide cuatro pasos largos. Por tanto, debo andar 20 pasos. Si le pedimos que vaya a PaseoZorrilla[100] y el Paseo Zorrilla solo tiene 75 casas, él contará 400 pasos, y con mucha probabilidad, se pare delante de un autobús! El listado 9.3 muestra lo que sucede cuando escribimos valores más allá del final del vector. PRECAUCIÓN: No ejecutes este programa, puede bloquear tu ordenador! Programa 9.3: Cuidado con el final de un vector 1: /* Listado 7.7 2: Ejemplo de lo que ocurre cuando escribimos mas alla 3: del final de un array */ 4: 5: #include <stdio.h> 6: int main() 7: { 8: short calleuno[3]; 9: short paseozorrilla[20]; // array a rellenar 10: short calledos[3]; 11: int i; 12: for (i=0; i<3; i++) 13: { 14: calleuno[i] = -1; calledos[i] = -2; 15: } 16: 17: for (i=0; i<=25; i++) 18: paseozorrilla[i] = i; 19: 20: printf("test 1: \n"); 21: printf("paseozorrilla[0] : %d \n", paseozorrilla[0]); 22: printf("paseozorrilla[20]: %d \n", paseozorrilla[20]); 23: 24: printf("\nasignando..."); 25: paseozorrilla[21] = 21;

Vectores y Matrices 5 26: 27: printf("\ntest 2: \n"); 28: printf("paseozorrilla[0] : %d\n", paseozorrilla[0] ); 29: printf("paseozorrilla[20]: %d\n", paseozorrilla[20]); 30: printf("paseozorrilla[21]: %d\n", paseozorrilla[21]); 31: for (i = 0; i<3; i++) 32: printf("calleuno[%d]: %d\n", i, calleuno[i]); 33: 34: for (i = 0; i<3; i++) 35: printf("calledos[%d]: %d\n", i, calledos[i]); 36: 37: return 0; 38: } Salida del programa Test 1: paseozorrilla[0] : 0 paseozorrilla[20]: 20 Asignando... Test 2: paseozorrilla[0] : 0 paseozorrilla[20]: 20 paseozorrilla[21]: 21 calleuno[0]: 20 calleuno[1]: 21 calleuno[2]: -1 calledos[0]: -2 calledos[1]: -2 calledos[2]: -2 Análisis: Primero se declaran dos vectores de tres enteros que actúan como centinelas alrededor de paseozorrilla. Estos vectores centinelas se inicializan con los valores -1 y -2. Si escribimos algo en la memoria después del final de paseozorrilla, alguno de los centinelas cambiará probablemente de valor. Algunos ordenadores asignan memoria de arriba abajo (de direcciones altas a direcciones bajas) mientras que otros lo hacen de abajo hacia arriba (de direcciones bajas a direcciones altas). Por esta razón, hemos colocado centinelas a ambos lados de paseozorrilla. Después se asignan valores a los miembros de paseozorrilla, pero el contador cuenta hasta los subíndices 20 y 21, que no existen en paseozorrilla. Podemos observar que al imprimir paseozorrilla[20] se escribe sin ningún problema el valor 20. Sin embargo, cuando se imprimen calleuno y calledos, observamos que calleuno[0] ha cambiado. Esto se debe que la zona de memoria de paseozorrilla[20] coincide con la zona de memoria de calleuno[0].

Vectores y Matrices 6 1.4. Inicialización de un vector Se puede inicializar una vector de tipos estándar, como enteros o caracteres, cuando se declara por primera vez. Después del nombre del vector se coloca el operador de asignación (=), seguido de una lista de valores separados por comas y encerrados entre llaves. Por ejemplo, la sentencia int vectorenteros[5] = { 10, 20, 30, 40, 50 }; declara vectorenteros como un vector de cinco elementos, y asigna a vectorenteros[0] el valor 10, a ArrayEnteros[1] el valor 20, y así sucesivamente. Si se omite el tamaño del vector, se creará un vector lo suficientemente grande para contener todos los valores listados en la inicialización. Por tanto, la sentencia int vectorenteros[] = { 10, 20, 30, 40, 50 }; creará el mismo vector que se creaba en la sentencia previa. Si necesitamos conocer el tamaño de un vector, podemos decirle al compilador que lo calcule. Por ejemplo, unsigned short LongitudVectorEnteros; LongitudVectorEnteros = sizeof(vectorenteros)/sizeof(vectorenteros[0]); asigna a la variable LongitudVectorEnteros el resultado de dividir el tamaño del vector completo por el tamaño de un elemento del vector. Este cociente es el número de miembros del vector. No podemos inicializar más elementos de los que hemos declarado para el vector. Por tanto, int vectorenteros[5] = { 10, 20, 30, 40, 50, 60}; genera un error porque hemos declarado un vector de cinco miembros y hemos inicializado seis valores. Sin embargo si que es válido escribir int vectorenteros[5] = { 10, 20}; Los valores no inicializados son automáticamente inicializados a cero. 2. Matrices (arrays multidimensionales) Es posible manejar arrays de más de una dimensión, denominados en general matrices. Cada dimensión está representada por un subíndice en la matriz. Por tanto, una matriz bidimensional tiene dos subíndices; una matriz tridimensional tiene tres subíndices; y así sucesivamente. Una matriz puede tener cualquier número de dimensiones, aunque las matrices más utilizadas son las de dos dimensiones. Un buen ejemplo de matriz es un tablero de ajedrez. Una dimensión representa las ocho filas; la otra dimensión representa las ocho columnas. La figura 9.2 ilustra esta idea.

Vectores y Matrices 7 Figura 9.2. Un tablero de ajedrez y una matriz. La declaración de una matriz que represente un tablero de ajedrez podría ser: int tablero[8][8]; También podríamos representar los mismos datos con una matriz de 64 elementos. Por ejemplo int tablero[64]; Esto no tiene una correspondencia tan directa con el mundo real como la matriz. Al comienzo de la partida el rey está situado en la cuarta posición de la primera fila. En la matriz esta posición corresponde a tablero[0][3]; suponiendo que el primer subíndice corresponde a la fila y el segundo a la columna. La disposición de las posiciones del tablero completo se muestra en la figura 9.2. 2.1. Inicialización de matrices Las matrices también se pueden inicializar. La asignación de la lista de valores a los elementos de la matriz se realiza manteniendo el primer índice fijo mientras el segundo varía. Por tanto, si tenemos una matriz int matriz1[5][3]; los tres primeros elementos irán a matriz1[0], los tres siguientes a matriz1[1], y así sucesivamente. La matriz anterior se puede inicializar de la siguiente manera: int matriz1[5][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; Para mayor claridad, se pueden agrupar los valores entre llaves. Por ejemplo, int matriz1[5][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, {13,14,15} }; El compilador ignora las llaves interiores, que hacen más sencillo comprender cómo se distribuyen los valores. Cada valor debe separarse con una coma, independientemente de que se utilicen llaves o no. La inicialización completa si que debe encerrarse entre llaves, y debe finalizar con punto y coma.

Vectores y Matrices 8 El listado 9.4 crea una matriz bidimensional. La primera dimensión contiene los números del 0 al 4. La segunda dimensión consta de los valores que duplican los valores de la primera dimensión. Programa 9.4: Creación de una matriz multidimensional 1: #include <stdio.h> 2: int main() 3: { 4: int i,j; 5: int matriz[5][2] = { {0,0}, {1,2}, {2,4}, {3,6}, {4,8}}; 6: 7: for (i = 0; i<5; i++) 8: { 9: for (j=0; j<2; j++) 10: { 11: printf("matriz[%d][%d] = ", i, j); 12: printf("%d \t", matriz[i][j]); 13: } 14: printf("\n"); 15: } 16: 17: return 0; 18: } Salida del programa matriz[0][0] = 0 matriz[0][1] = 0 matriz[1][0] = 1 matriz[1][1] = 2 matriz[2][0] = 2 matriz[2][1] = 4 matriz[3][0] = 3 matriz[3][1] = 6 matriz[4][0] = 4 matriz[4][1] = 8 Análisis: La línea 5 declara matriz como matriz bidimensional. La primera dimensión consta de cinco enteros; la segunda dimensión consta de dos enteros. Esto crea una estructura como la de la figura 9.3. Figura 9.3. Una matriz de 5x2. Los valores se inicializan por parejas. Las líneas 7 y 8 crean un bucle anidado. El bucle externo recorre los elementos de la primera dimensión. Para cada miembro de esta dimensión, el bucle interno recorre cada uno de los miembros de la segunda dimensión. Esto es consistente con la salida. Al elemento matriz[0][0] le sigue el elemento matriz[0][1]. Una vez que el índice de la segunda dimensión ha recorrido todos los elementos de dicha dimensión, el índice de la primera dimensión se incrementa y el índice de la segunda dimensión vuelve a empezar en cero.

Vectores y Matrices 9 3. Cadena de caracteres Una cadena es una serie de caracteres. Las únicas cadenas que hemos visto hasta ahora son las cadenas constantes que utilizamos en las sentencias con printf(), tal como printf("hola mundo"; C no tiene datos predefinidos tipo cadena. En su lugar, C manipula cadenas de caracteres mediante vectores de de caracteres que terminan con el carácter nulo ASCII ('\0'). Una cadena se considera como un vector de tipo char o unsigned char. Podemos declarar e inicializar una cadena del mismo modo que cualquier otro vector. El tipo base, naturalmente, es char, o bien, unsigned char. Por ejemplo, char texto[80]; char Saludo[] = { 'H', 'o', 'l', 'a',, ' ', 'M','u','n','d','o', '\0' }; El último carácter, '\0', es el carácter nulo, que muchas funciones C reconocen como terminador de una cadena. Aunque este procedimiento de inicializar un vector carácter-a-carácter es correcto, es difícil de escribir y es una fuente potencial de posibles errores. C nos permite usar una forma simplificada de la línea de código anterior. Esto es char Saludo[] = "Hola Mundo"; Hay dos observaciones importantes sobre esta sintaxis: En lugar de caracteres entre comillas simples separados por comas y encerrados entre llaves, se utiliza una cadena de caracteres encerrada entre dobles comillas, sin comas y sin llaves. No es necesario añadir el carácter nulo porque el compilador lo hace de forma automática. La cadena Hola Mundo tiene 11 bytes: Hola tiene 4 bytes, el espacio 1 byte, Mundo 5 bytes, y el carácter nulo 1 byte. También podemos crear cadenas de caracteres sin inicializar. Al igual que con todos los vectores, es importante asegurar que no vamos a utilizar más espacio del reservado. El listado 9.5 muestra el uso de un vector sin valores iniciales. Programa 9.5. Rellenado de una cadena 1: /* Listado 7.9: rellenado de un vector */ 2: #include <stdio.h> 3: 4: int main() 5: { 6: char buffer[80]; 7: printf("escriba la cadena: "); 8: scanf("%s", buffer); 9: printf("este es el buffer: %s\n", buffer); 10: return 0; 11: }

Vectores y Matrices 10 Salida del programa Escriba la cadena: hola mundo Este es el buffer: hola Análisis: En la línea 6 se declara un buffer para 80 caracteres, tamaño suficientemente grande para contener una cadena de 79 caracteres y el carácter nulo para cerrar la cadena. En la línea 7, se pide al usuario que introduzca una cadena, que se almacena en buffer en la línea 8. Este programa presenta dos problemas. Primero, si el usuario teclea más de 79 caracteres, scanf() escribirá más allá del final de buffer. Segundo, si el usuario introduce un espacio, scanf() considera que es el final de la cadena y no escribe más caracteres en buffer. Los caracteres tecleados después del espacio se pierden. 3.1. Lectura de cadenas Para resolver estos problemas, debemos utilizar alguna de las funciones que veremos a continuación. Función gets() La función gets() se utiliza para leer un solo carácter o para leer una cadena de caracteres. El delimitador por defecto es nueva línea. El listado 9.6 ilustra su utilización. Listado 9.6. Rellenado de una cadena con gets() 1: /* Listado 7.10: rellenado de una cadena */ 2: #include <stdio.h> 3: 4: int main() 5: { 6: char buffer[80]; 7: printf("escriba la cadena: "); 8: gets(buffer); 9: printf("este es el buffer: %s\n", buffer); 10: return 0; 11: } Salida del programa Escriba la cadena: Hola Mundo Este es el buffer: Hola Mundo

Vectores y Matrices 11 3.2. Manejo de cadenas Funciones strcpy() y strncpy() C dispone de una librería de funciones para manejar cadenas: la librería string.h. Entre las muchas funciones disponibles, hay dos para copiar una cadena en otra: strcpy() y strncpy(). strcpy() copia el contenido completo de una cadena en el buffer indicado. El listado 9.7 muestra el uso de strcpy(). Programa 9.7: Ejemplo de uso de strcpy() #include <stdio.h> #include <string.h> int main() { char Cadena1[] = "Cadenas de caracteres"; char Cadena2[80]; strcpy(cadena2, Cadena1); } printf("cadena1: %s\n", Cadena1); printf("cadena2: %s\n", Cadena2); return 0; Salida del programa Cadena1: Cadenas de caracteres Cadena2: Cadenas de caracteres Análisis: En la línea 2 se incluye el archivo de cabecera string.h. Este archivo contiene el prototipo de la función strcpy(). strcpy() toma dos cadenas de caracteres una cadena destino seguido de una cadena origen. Si la cadena origen es más larga que la cadena destino, strcpy() podría escribir fuera del buffer, más allá del último elemento del mismo. Vectores Para declarar un vector, escribe el tipo de variable a almacenar, seguido del nombre del vector y de un índice con el número de elementos que tendrá el vector. Ejemplo: int vectordeenteros[90]; Para acceder a los miembros de un vector, se utiliza el operador subíndice, []. Ejemplo: int ElNovenoEntero = VectorDeEnteros [8]; Los vectores cuentan desde cero. Un vector de n elementos se numera de 0 a n-1.

Vectores y Matrices 12 Nota del profesor: si detectas algún error, o hay alguna parte confusa, o piensas que sobra o falta alguna sección, por favor, enviadme un mensaje a josdie@tel.uva.es. Gracias por anticipado. Vuestras sugerencias se utilizarán para mejorar estos apuntes.