Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de...

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

Transcript of Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de...

Page 1: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

Tema 7Vectores y cadenas de caracteres

Fundamentos de Informática

Page 2: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

2Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Índice1. ¿Qué es un vector?2. Vectores unidimensionales3. Cadenas de caracteres4. Paso de vectores unidimensionales a funciones.5. Vectores multidimensionales: matrices6. Paso de vectores multidimensionales a funciones

Page 3: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

1

Introducción

Page 4: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

4Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

¿Qué es un VECTOR?

• Un VECTOR es un conjuntoconjunto de datos del mismo tipotipo al que se hace referencia mediante un identificador (nombre) común.

• Un VECTOR puede tener varias dimensiones.– 1 dimensión ‐> VECTOR– 2 dimensiones ‐> MATRIZ– 3 dimensiones, etc.

• La referencia a elementos concretos del VECTOR se lleva a cabo utilizando el nombre del VECTOR y uno o más índices (dependiendo de las dimensiones).

• La primera posición de un vector en cada una de sus dimensiones es siempre cero.

Page 5: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

5Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

¿Qué es un VECTOR?

Referencia el tercer elemento de la variable Lista.Para asignar:Para asignar:

Lista[2]= -11;Para extraer informaciPara extraer informacióón:n:

printf(“El valor es %d”,Lista[2]);resultado=Lista[2];

DeclaraciDeclaracióón del VECTORn del VECTOR

int Lista[6];

• Los índices son números enteros positivos que están encerrados entre corchetes.

15 -20 -11 70 -3 5

0 31 2 4 5

ListaVector Vector

unidimensionalunidimensional

Page 6: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

6Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

¿Qué es un VECTOR?

Vector Vector

BidimensionalBidimensional

óó MatrizMatriz

15 -20 64 70 -3 5

0 31 2 4 5

43 2 11 -4 11 27

11 17 -47 -11 -12 1

0

1

2

Referencia el elemento de la tercera fila y la cuarta columna de la variable ListaPara asignar:Para asignar:

Lista[2][3]=-11;Para extraer informaciPara extraer informacióón:n:

printf(“El valor es %d”,Lista[2][3]);resultado=Lista[2][3];

DeclaraciDeclaracióón del la matriz:n del la matriz:

int Lista[3][6];

ListaLista

Page 7: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

2

Vectores unidimensionales

Page 8: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

8Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Vectores unidimensionales• Es un conjunto de elementos del mismo tipo.• Declaración:

tipo nombre_vector[TAMAtipo nombre_vector[TAMAÑÑO];O];– Tipo

• Hace referencia al tipo de los datos contenidos en el vector.– Tamaño

• Hace referencia al número de elementos máximos que puede contener el VECTOR.

OJO: Este tamaño se define en tiempo de compilación y no puede modificarse a lo largo del programa.

Programación estática versus programación dinámica.

• Muy útil la utilización del #define para los tamaños• En la ejecución del programa, se reservan tantos huecos como el tamaño definido del vector, siendo cada hueco del tamaño requerido por el tipo de dato del vector. 

• El primer elemento de un VECTOR tiene obligatoriamente índice 0.• Si un VECTOR tiene como máximo n elementos, el último elemento se 

referenciará con el índice n‐1.

Page 9: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

9Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Vectores unidimensionales: EjemploDeclaración de un vector de 10 elementos enteros

Primera posición del vector

Última posición del vector

Elemento t del vector x

#include<stdio.h>int main(void){int x[10];int t;

for (  t = 0  ;  t<10 ; t++ ) {x[t] = t; /*asigna un valor a cada elemento del vector*/ 

}printf(“Los elementos del vector x son:\n”);for ( t = 0  ;  t<10  ; t++ ) {printf(“%d”, x[t]); /*escribir los elementos*/

}return 0;

} ¿Cuál es la salida del programa?

Page 10: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

10Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Vectores unidimensionales: Ejemplo

Si cambia el tamaño del vector con cambiar el valor del #define es suficiente

El mismo ejemplo anterior utilizando #define:

#include<stdio.h>#define N 10void main(void){int x[N];int t;

for (  t = 0  ;  t < N  ; t++ ) {x[t] = t; /* asigna un valor a cada elemento del vector */ 

}printf(“Los elementos del vector x son:\n”);for ( t = 0  ;  t < N  ; t++ ) {printf(“%d”, x[t]); /*escribir los elementos*/

}}

MUCHO MEJOR

Page 11: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

11Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Advertencias

• C no hace comprobaciones sobre los VECTORES:– Mucho cuidado con intentar acceder, tanto para escribir como para 

leer, a alguna posición inexistente del vector.• C no nos dirá nada y se producirá un error en tiempo de ejecución.

• Como mucho nos podrá avisar con un “warning” si el error es muy evidente.

• Será necesario definir un tamaño suficientemente grande para cada caso (pero hay que optimizar recursos)

• Es posible inicializar los elementos de un vector en el momento de la declaración de la variable:tipo   vector[N]  = {valor1, valor2,tipo   vector[N]  = {valor1, valor2,…….., valor N.., valor N‐‐1};1};

siendo N el número de elementos  de la variable vector

Page 12: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

12Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Manejo de VECTORES

• C no permite realizar operaciones con vectores completos (salvo en el caso de las cadenas de caracteres en las que sí existen funciones de C que manejan la cadena al completo):

int lista[10];

scanf(“%d”,&lista); ERRORERRORprintf(“%d”, lista); ERRORERROR

Page 13: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

13Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Manejo de VECTORES• Para llevar a cabo estas operaciones es necesario hacer uso de bucles.• Generalmente se utilizan bucles for: el grado de anidamiento depende de 

la dimensión del VECTOR

#include<stdio.h>#define N 4int main(void){

int ejemplo[N] ={1,2,3,4}; /*inicializar un vector en el momento de la declaración*/

int copy[N];int i;

for ( i=0 ; i < N ; i++) {copy[i]= ejemplo[i]; /*copiar un vector en otro*/

}for ( i= 0; i<N; i++) {

printf(“%d”, ejemplo[i]); /*escribir los elementos*/

}return 0;

}

Page 14: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

14Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Vectores unidimensionales: Ejemplo

Dirección de la posición i del vector ejemplo, donde se va a guardar el valor leído mediante scanf()

Programa que calcula la media de 20 dígitos leídos desde el teclado

#include<stdio.h>#define N 20int main(void){int ejemplo[N];int i;int sum;for (i = 0; i<N; i++) {printf(“Escriba el número %d:  “, i);scanf(“%d”,  &ejemplo[i]   ); /*rellenar el vector*/

}sum = 0;for ( i= 0; i<N; i++) {/*sumar los números*/sum = sum + ejemplo[i];}printf(“La media es %d\n”, sum/N);return 0;

}

Page 15: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

3

Cadenas de caracteres

Page 16: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

16Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Cadenas de caracteres

• Es un VECTOR unidimensional que almacena caracteres.• Se diferencia de un VECTOR de un tipo numérico en que :

1. el último carácter de la cadena va seguido por del carácter ‘\0’, que indica el fin de cadena.

2. Existen funciones en C que las manejan como un conjunto.• Declaración

char nombre[N];

– En una cadena de caracteres de N posiciones  sólo es posible almacenar una cadena de N‐1 caracteres.

– La última posición de la cadena está ocupada por el carácter ‘\0’• No confundir:

– “a”: cadena de dos caracteres (comilla doble), el carácter ‘a’ y el ‘\0’ (el propio compilador cuando encuentra una cadena de caracteres inserta automáticamente el ‘\0’)

– ‘a’: carácter (comilla simple)• El final de una cadena de caracteres viene marcado por un carácter 

especial que es el carácter nulo ‘\0’

Page 17: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

17Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

• Función gets(): – Entrada de cadena de caracteres– El argumento debe ser una variable de varios elementos (vector 

de caracteres o cadena de caracteres) de tipo carácter.– Lee de la entrada estándar una cadena de caracteres– Si ha habido error, gets() devuelve NULL– Prototipo:

char *gets( char *cadena_de_caracteres );– Utilización:

char cadena[30];gets(cadena);

Cadenas de caracteres: Lectura

Page 18: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

18Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

• Función printf() con especificador de formato %s: – Utilización:

printf("%s, cadena);printf("La cadena vale: %s\n",cadena);

• Función puts(): – Prototipo:

int puts( char * cadena_de_caracteres );– Utilización:

puts(cadena);

Cadenas de caracteres: escritura

Page 19: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

19Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

#include<stdio.h>#define N 10int main(void){

char cad[N];gets(cad);puts(cad);…

}

• Las funciones printf(), scanf(), gets() y puts() permiten trabajar directamente sobre cadenas sin necesidad de utilizar bucles.

Peligros: • Cuidado al utilizar scanf(“%s”, cad); ya que SÓLO lee una palabra (no una frase),

pues cuando encuentra el carácter ‘�n’ o ‘ ’ (el carácter blanco), scanf() finaliza la lectura del buffer.Por lo tanto, es mejor utilizar gets(cad); para leer una frase.

• Sin embargo, tanto scanf() como gets() no realizan ningún control para evitar leer más caracteres de los reservados por la variable vector, lo que resulta muy peligroso.

ATENCIÓN: Cuando se lee una cadena de caracteres, no se utiliza ‘&’ con el nombre de la variable (el propio nombre de la variable ya es la dirección de la primera posición del vector, como se verá en el tema 7).

#include<stdio.h>#define N 10int main(void){char cad[N];scanf(“%s”,  cad );printf(“%s”, cad);……

}

Cadenas de caracteres: Lectura 

Page 20: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

20Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

• La mejor opción para leer cadenas de caracteres: fgets() ya que:– Esta función controla que el número de caracteres leído no

excedan el tamaño de la cadena destino, indicando dicho tamaño en el segundo argumento de la función.

– Lee una frase completa, no únicamente palabras.• El prototipo de la función es:

char * fgets(char *cadena, int tam�cad, FILE *puntero�a�archivo).– Lee una cadena de caracteres del archivo apuntado por

puntero�a�archivo y la almacena en cadena.– La lectura se acaba cuando se encuentra el carácter ‘�n’ (que SÍ

se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘�n’ en la cadena) o cuando se han leído tam�cad-1 caracteres. En todos estos casos, se escribe un carácter ‘�0’ en la cadena a continuación del último carácter leído.

– Valor de retorno:• Éxito: es un puntero a la cadena leída.• Fracaso: NULL, si se llega al final de fichero u ocurre un error

Cadenas de caracteres: Lectura

Page 21: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

21Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Cadenas de caracteres: lectura

#include <stdio.h>#define N 10

int main(void){

char cad[N];

fgets (cad, N, stdin);

puts(cad);…

}

• De momento, vamos a utilizar la función de la siguiente manera:

Indica que lee de la entrada estándar

Tamaño de la cadena destino, donde se va a guardar la frase leída.

Identificador de la cadena destino (nombre de la variable de tipo cadena)

Page 22: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

22Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Ejemplo cadenas de caracteres

#include<stdio.h>#include<ctype.h>#define TAM 80int main(void){

char letras[TAM];int cont;

for (cont = 0; cont< TAM; cont++) {/*leer carácter a carácter*/letras[cont] = getchar();

}for (cont = 0; cont< TAM; cont++) {

/*escribir en mayúscula*/putchar( toupper(letras[cont]) );

}return 0;

}

Programa que lee una línea de texto carácter a carácter y la transforma escribiéndola en mayúsculas

Page 23: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

23Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Ejemplo cadenas de caracteres

#include<stdio.h>#include<ctype.h>#define TAM 80int main(void){

char letras[TAM];int cont;

fgets(letras, TAM, stdin)

for (cont = 0; cont< TAM; cont++) {/*escribir en mayúscula*/putchar( toupper(letras[cont]) );

}return 0;

}

Programa que lee una línea de texto con fgets() y la transforma escribiéndola en mayúsculas

Page 24: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

24Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Funciones para el manejo de cadenas

• Hay que incluir el archivo de cabecera string.h• strcpy(), “string copy”

Se utiliza para copiar el contenido de la cadena cad2 en la cadena cad1. La forma general de esta función es:

strcpy(cad1, cad2);strcpy(cad1, cad2);• strcat(), “string cat”

La función strcat() añade la cad2 al final de la cad1 y lo almacena en la cad1. La forma general de esta función es:

strcat( cad1, cad2);strcat( cad1, cad2);

Advertencia: Mucho cuidado al copiar o concatenar dos cadenas coAdvertencia: Mucho cuidado al copiar o concatenar dos cadenas con strcpy() o n strcpy() o strcat() ya que si nos pasamos del tamastrcat() ya que si nos pasamos del tamañño reservado para la cadena de o reservado para la cadena de caracteres, el compilador no nos avisa y puede fallar en la ejeccaracteres, el compilador no nos avisa y puede fallar en la ejecuciucióón.n.

Page 25: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

25Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Funciones para el manejo de cadenas

• strcmp(), “string compare”– Compara  dos  cadenas  (según  el  orden  de  los  caracteres  en  la  tabla 

ASCII):• Si las cadenas son iguales, la función devuelve un cero.• Si cad1 es mayor que cad2 la función devuelve un número positivo. • Si cad1 es menor que cad2 la función devuelve un número negativo. 

– La forma general de la función es:strcmp(cad1, cad2);strcmp(cad1, cad2);

• strlen(), “string length”– Devuelve  la  longitud de  la cadena, sin contar el carácter  ‘\0’. La forma 

general de la función es:strlen(cad);strlen(cad);

Ejercicio: Programar en C estas cuatro funciones.

Page 26: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

26Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Cadenas de Caracteres: Ejemplos

EJEMPLO 3/* Función que indica si la contraseña

introducida por el usuario es correcta (devuelve 1) o incorrecta (devuelve 0) */

int Contrasegna(void){

char c[N];int resultado;

printf(“introduzca contraseña: “);fgets(c, N, stdin);if ( strcmp(c, “Abracadabra”) != 0) {

printf(“contraseña incorrecta\n”);resultado = 0;

} else {resultado = 1;

}return resultado;

}

EJEMPLO 1#include<stdio.h>#include<string.h>int main(void){ char cad[80];

strcpy(cad, “Hola”);printf(“%s”, cad);return 0;

}

EJEMPLO 2Es un error hacer: cad=“Hola”;#include<stdio.h>#include<string.h>int main(void){

char cad1[20];char cad2[10];strcpy(cad1, “Hola”);strcpy(cad2, “amigos”);strcat(cad1, cad2);printf(“%s”, cad1);return 0;

}

Page 27: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

27Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

#include<stdio.h>#include<string.h>#define N 80int main(void){

char cad[N];printf(“introduzca una cadena: “);

fgets(cad, N, stdin);printf(“%d”, strlen(cad));return 0;

}

Cadenas de Caracteres: Ejemplos

#include<stdio.h>#include<string.h>#define N 80int main(void){

char cad[N];int i;printf(“Introduzca una cadena: “);fgets(cad, N, stdin);for (i = strlen(cad) –1; i>=0;i--) {

printf(“%c”, cad[i]);}return 0;

}

EJEMPLO 5

Programa que imprime una cadena al revés

EJEMPLO 4

Programa que imprime la longitud de la cadena leída

Page 28: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

28Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Paso de vectores unidimensionales a funciones

• Una  función  puede  tener  como  argumento  tanto  vectores unidimensionales  (vectores  o  cadenas  de  caracteres)  como  vectores multidimensionales (matrices). 

• Paso de argumento de un vector unidimensional: Se puede pasar como argumento un vector unidimensional completo a una función. La manera de hacerlo es: 

– Se  utiliza  el  nombre  del  vector  sin  corchetes  y  sin  índices  como parámetro real en la llamada a la función.

– En el correspondiente parámetro formal se debe escribir el tipo, el nombre del vector y un par de corchetes vacíos.

– Se  debe  declarar  el  prototipo  de  la  función  (en  este  caso  la declaración del nombre del vector es opcional, pero se debe escribir el tipo y dos corchetes vacíos).

Como las cadenas de caracteres son vectores unidimensionales de tipo carácter, se cumplen estas mismas normas.

Page 29: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

29Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

• Cuando  se  pasa  un  vector  a  una  función  no  se  pasan  los  valores  del vector, sino sólo la dirección del primer elemento.

• El  nombre  del  vector  se  interpreta  como  la  dirección  del  primer elemento.

• El parámetro formal de la función se convierte en un puntero al primer elemento.

• En  el  paso  de  vectores  a  una  función  se  realiza  un  PASO  POR REFERENCIA,  en  vez  de  un  paso  por  valor  (como  hemos  usado  hasta ahora).

• Cualquier  cambio  en  los  elementos  del  vector modificará los  valores originales del mismo.

• Como la instrucción return sólo puede devolver un valor a la función que la invocó, el uso de parámetros por referencia permite devolver más de un valor.

Paso de vectores unidimensionales a funciones

Page 30: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

30Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

#include <stdio.h>#define N 100float Media(int a, float x[ ]);int main(void){

int n;float med;float lista[N];………..med = Media(n, lista );………

}float Media(int a, float x[ ] ) /*definición de función*/{……….}

Paso de vectores unidimensionales a funciones

Parámetro formal(tipo del vector y corchetes)

Parámetro real (nombre del vector) Dirección del primer elemento

Prototipo de la función

Page 31: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

31Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Paso de vectores unidimensionales a funciones

Parámetro real: se pasa como argumento real la dirección del primer elemento del vector, que viene determinada por el nombre de la variable vector, en este caso a.

Prototipo de la función

#include<stdio.h>#define N 3void Modificar(int x[ ]);int main(void){ int a[N];

int i;printf(“los valores\n”);for (i=0;i<N;i++) {

scanf(“%d:”, &a[i]);}printf(“\n”);printf(“\nlos valores originales en main son: “);for (i=0;i<N; i++) {

printf(“%d “, a[i]);}printf(“\n”);Modificar( a );printf(“\nlos valores en main depues del cambio son: “);for (i=0;i<N; i++) {

printf(“%d”,a[i]);}return 0;

}

Page 32: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

32Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Paso de vectores unidimensionales a funciones

Se modifican los valores del vector x. Por la llamada a la función modificar(a), en este caso la variable x apunta al primer elemento de la variable vector a.

Parámetro formal: la variable x tomará en cada llamada a la función la dirección del primer elemento de la variable vector con que se le llame.

void Modificar(int x[ ] ){ int i;

for (i=0;i<N; i++) {x[i]=2*x[i];

}printf(“\nEn modificar los valores son: “);for (i=0;i<N; i++) {

printf (“%d “,x[i]);}

}

Page 33: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

33Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Paso de vectores unidimensionales a funciones

Comprobar que no se sobrepasa el tamaño del vector

#include <stdio.h>#define  TAM  100void Reordenar(int  n, int x[ ]);intmain(void ){  int i; int n;int x[TAM];do {printf(“\n¿Cuantos numeros va a introducir?\n “);printf(“No pueden ser mas de %d numeros”, TAM);   scanf(“%d”, &n);

} while (n > TAM     || n <= 0);for (i = 0; i< n; i++) {printf(“i = %d  x =  “, i+1);scanf(“%d”, &x[i]);

}Reordenar(n,x);printf(“\nLista de números reordenada:\n”);for (i = 0;i< n; i++) {printf(“i = %d    x = %d\n”, i+1,x[i]);

}return 0;

}

Page 34: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

34Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Paso de vectores unidimensionales a funciones

void Reordenar(int n, int x[ ]){

int k;int i;int temp;

for (k= 0; k< n-1; k++) {for (i = k+1; i< n; i++) {

if (x[i] < x[k]) {temp = x[k];x[k] = x[i];x[i] = temp;

}}

}}

Ejemplo de ordenación: n = 5

3 4 1 9 2

0 1 2 3 4

Page 35: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

35Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Vectores multidimensionales ó Matrices

• El concepto es el mismo que en el caso de los vectores unidimensionales.– Hay que definir más de un índice (tantos como dimensiones).– Para referenciar a un elemento concreto hay que utilizar más de un 

índice.– El recorrido de un vector multidimensional se lleva a cabo anidando 

varios for.• El grado de anidamiento dependerá del número de dimensiones del vector.

– A los vectores multidimensionales también se les llama matrices.• Declaración:

tipo nombre [M][N];– Por ejemplo, una variable de nombre “lista_numeros” de tipo vector 

bidimensional de enteros con M filas y N columnas se declara como: int lista_numeros[M][N];

Page 36: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

36Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Vectores multidimensionales

• Inicialización de un vector multidimensional:– Se asignan por filas, de manera que primero se asignan los 

elementos de la primera fila, luego los de la segunda, etc.– Si hay pocos elementos dentro de cada par de llaves, se asigna 

cero a los elementos que falten.– El número de elementos dentro de cada par de llaves no puede 

exceder el tamaño definido de la fila

int x[2][3] = {1,2,3,4,5,6};

x[0][0] = 1 x[0][1] = 2 x[0][2] = 3x[1][0] = 4 x[1][1] = 5 x[1][2] = 6 

int x[2][3] =  {{1,2,3},{4,5,6} };

En todos estos casos se consigue lo mismo

Ejemplo 1

Ejemplo 2

Ejemplo 3

Page 37: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

37Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Vectores multidimensionales: Ejemplo#include<stdio.h>#define M 2#define N 3int main(void){int x[M][N]= {{6,2}, {3,4,1}};int i, j;

for (i = 0; i <M; i++) {       /* Recorre filas */for (j = 0; j < N; j++) {    /* Recorre columnas */printf(“%d”, x[i][j]);

}printf(“\n”);

}return 0;

}

Resultado: 6 2 03 4 1

Page 38: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

38Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

#include<stdio.h>#define NF 3#define NC 4int main(void){int a[NF][NC];int i, j;

for (i=0;i<NF;i++) {for (j=0;j<NC;j++) {printf(“Elemento %d,%d : “, i,j);scanf(“%d”,&a[i][j]);

}}

printf(“\nLa matriz introducida es:\n\n”);for (i =0;i <NF;i++) { for (j =0;j <NC;j++) { printf(“%d ”,a[i][j]);

}printf(“\n”);

}return 0;

}

Programa que lee y escribe una matriz bidimensional de 3 filas y 4 columnas

Vectores multidimensionales: Ejemplo

Page 39: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

39Departamento de Sistemas InformáticosEscuela Técnica Superior de Ingeniería ICAI

Vectores y cadenas de caracteres

Paso de vectores multidimensionales a funciones

• Paso de un vector multidimensional: Se  puede  pasar  un  vector multidimensional  completo  a  una  función como argumento. 

– Es  similar  al  paso  de  un  vector  unidimensional  salvo  porque  es necesario  en  el  parámetro  formal  especificar  todos  los  índices excepto el primer índice que se escribe entre corchetes vacíos.

#include <stdio.h>#define N 3#define M 5void InicializaMatriz(int matriz[ ] [M]);int main (void) {

int mat[N][M];.......InicializaMatriz(mat);.....

}

void InicializaMatriz(int matriz[ ] [M]){

int n;int m;for (n=0; n< N; n++) {

for (m=0; m<M; m++) {mat[n][m] = 0;

}}

}

Ejemplo: Función que inicializa una matriz de 3x5

Page 40: Tema 7 Vectores y cadenas de caracteres...se escribe en la cadena), cuando se encuentra el fin de fichero (en este caso no se escribe ‘˜n’ en la cadena) o cuando se han leído

Escuela Técnica Superior de Ingeniería ICAIAlberto Aguilera 2528015 MadridTel +34 91 542 28 00Fax + 34 91 542 31 76Iwww.icai.upcomillas.es

www.upcomillas.es