Está en la página 1de 45

ICAI – 1º Grado en Ingeniería en

Tecnologías Industriales

Fundamentos de Informática

Tema 7
Vectores y cadenas de
caracteres

Tema 7: Vectores y cadenas de caracteres


1
Contenidos

Sección 1:
• Introducción. ¿Qué es un vector?
• Vectores unidimensionales
• Cadenas de caracteres
• Paso de vectores unidimensionales a funciones.
Sección 2:
• Vectores multidimensionales: matrices
• Paso de vectores multidimensionales a funciones

Tema 7: Vectores y cadenas de caracteres


2
Sección 1
• Introducción ¿Qué es un vector?
• Vectores unidimensionales
• Cadenas de caracteres
• Paso de vectores unidimensionales a
funciones
1

Introducción
¿Qué es un VECTOR?

• Un VECTOR es un conjunto de datos del mismo tipo 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.

Tema 7: Vectores y cadenas de caracteres


5
¿Qué es un VECTOR?

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

Vector
Lista 15 -20 -11 70 -3 5
unidimensional

0 1 2 3 4 5

Declaración del VECTOR Referencia el tercer elemento de la variable Lista.


int Lista[6]; Para asignar:
Lista[2]= -11;

Para extraer información:


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

Tema 7: Vectores y cadenas de caracteres


6
¿Qué es una MATRIZ?

0 1 2 3 4 5
Lista
0 15 -20 64 70 -3 5 Vector
Bidimensional
1 43 2 11 -4 11 27
ó Matriz
2 11 17 -47 -11 -12 1

Referencia el elemento de la tercera fila y la cuarta columna de


Declaración del la matriz: la variable lista
int lista[3][6]; Para asignar:
lista[2][3]=-11;

Para extraer información:


printf(“El valor es %d”,lista[2][3]);
resultado=lista[2][3];
Tema 7: Vectores y cadenas de caracteres
7
2

Vectores unidimensionales
Vectores unidimensionales
• Es un conjunto de elementos del mismo tipo.
• Declaración:
tipo nombre_vector[TAMAÑ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 en ejecución.
(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 referencia con el
índice n-1.

Tema 7: Vectores y cadenas de caracteres


9
Vectores unidimensionales: Ejemplo

#include<stdio.h>
Declaración de un vector de 10
int main(void) elementos enteros
{
int x[10]; Primera posición del vector
int t;
Última posición del vector, la 9
for ( t = 0 ; t<10 ; t++ ) {
x[t] = t; /*asigna un valor a cada elemento del vector*/
}
Elemento t del vector x
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?
}
Tema 7: Vectores y cadenas de caracteres
10
Vectores unidimensionales: Ejemplo
El mismo ejemplo anterior utilizando #define: MUCHO MEJOR

#include<stdio.h>
#define N 10 Si cambia el tamaño del vector
void main(void) con cambiar el valor del #define
es suficiente
{
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*/
}
}
Tema 7: Vectores y cadenas de caracteres
11
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,..., valorN-1};

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

Tema 7: Vectores y cadenas de caracteres


12
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); ERROR


printf(“%d”, lista); ERROR

Tema 7: Vectores y cadenas de caracteres


13
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 4
int 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]); /*Mostrar los elementos*/
}
return 0;
}
Tema 7: Vectores y cadenas de caracteres
14
Vectores unidimensionales: Ejemplo
#include<stdio.h>
#define N 20 Programa que calcula la media de 20
int main(void) dígitos leídos desde el teclado
{
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++) {
Dirección de la posición i del vector
/*sumar los números*/
ejemplo, donde se va a guardar el valor
sum = sum + ejemplo[i];
leído mediante scanf()
}
printf(“La media es %d \n”, sum/N);
return 0;
}
Tema 7: Vectores y cadenas de caracteres
15
3

Cadenas de caracteres
Cadenas de caracteres

• Es un VECTOR unidimensional que almacena caracteres.


• Se diferencia de un VECTOR de 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’

Tema 7: Vectores y cadenas de caracteres


17
Cadenas de caracteres: Lectura

• 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, PERO NO
controla el tamaño de lo leído. Función POCO SEGURA.
• Si ha habido error, gets() devuelve NULL
• Prototipo:
char *gets( char *cadena_de_caracteres );
• Utilización:
char cadena[30];
gets(cadena);

Tema 7: Vectores y cadenas de caracteres


18
Cadenas de caracteres: Escritura

• 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);

Tema 7: Vectores y cadenas de caracteres


19
Cadenas de caracteres: Lectura
• Las funciones printf(), scanf(), gets() y puts() permiten trabajar directamente
sobre cadenas sin necesidad de utilizar bucles.
#include<stdio.h> #include<stdio.h> ATENCIÓN: Cuando se lee
#define N 10 #define N 10 una cadena de caracteres,
no se utiliza ‘&’ con el
int main(void) int main(void)
{ nombre de la variable (el
{
char cad[N]; char cad[N]; propio nombre de la variable
gets(cad); scanf(“%s”,cad); ya es la dirección de la
puts(cad); printf(“%s”, cad); primera posición del vector,
… …… como se verá en el tema 7).
} }

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.
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.

Tema 7: Vectores y cadenas de caracteres


20
Cadenas de caracteres: Lectura fgets()
• 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
Tema 7: Vectores y cadenas de caracteres
21
Cadenas de caracteres: lectura
• De momento, vamos a utilizar la función de la siguiente manera:

#include <stdio.h>
#define N 10

int main(void) Indica que lee de la


{ entrada estándar
char cad[N];

fgets (cad, N, stdin);

puts(cad); 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)

Tema 7: Vectores y cadenas de caracteres


22
Ejemplo cadenas de caracteres
#include<stdio.h>
#include<ctype.h>
#define TAM 80
int main(void) Programa que lee una línea de texto
{ carácter a carácter y la muestra por
char letras[TAM]; pantalla en mayúsculas
int cont; POCO EFICIENTE

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;
}
Tema 7: Vectores y cadenas de caracteres
23
Ejemplo cadenas de caracteres
#include<stdio.h>
#include<ctype.h>
#define TAM 80
Programa que lee una línea de texto con
int main(void) fgets() y la muestra por pantalla en
{ mayúsculas
char letras[TAM]; MÁS EFICIENTE
int cont;

fgets(letras, TAM, stdin)

for (cont = 0; cont< TAM && letras[cont] != '\0'; cont++) {


/*escribir en mayúscula carácter a carácter*/
putchar( toupper(letras[cont]) );
}
return 0;
}

Tema 7: Vectores y cadenas de caracteres


24
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);
• 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);

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

Tema 7: Vectores y cadenas de caracteres


25
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);
• 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);

Ejercicio: Programar en C estas cuatro funciones.


Tema 7: Vectores y cadenas de caracteres
26
Cadenas de Caracteres: Ejemplos
EJEMPLO 1 EJEMPLO 3
#include<stdio.h>
/* Función que indica si la contraseña introducida por
#include<string.h>
#define N 80 el usuario es correcta (devuelve 1) o incorrecta
int main(void) (devuelve 0) */
{ char cad[N];
int Contrasegna(void)
strcpy(cad, “Hola”); {
printf(“%s”, cad); char c[N];
return 0; int resultado;
}
printf(“introduzca contraseña: “);
EJEMPLO 2 fgets(c,N,stdin);
LimpiarCadena(c);
//Es un error hacer: cad=“Hola”;
#include<stdio.h> if (strcmp(c,“Abracadabra”) != 0) {
#include<string.h> printf(“contraseña incorrecta\n”);
int main(void) resultado = 0;
{ } else {
char cad1[20]; resultado = 1;
char cad2[10]; }
return resultado;
strcpy(cad1, “Hola”); }
strcpy(cad2, “amigos”);
strcat(cad1, cad2);
printf(“%s”, cad1);
return 0;
}
Tema 7: Vectores y cadenas de caracteres
27
Cadenas de Caracteres: Ejemplos

EJEMPLO 4 EJEMPLO 5
Programa que muestra la Programa que muestra una
longitud de la cadena leída cadena al revés
#include<stdio.h> #include<stdio.h>
#include<string.h> #include<string.h>
#define N 80 #define N 80

int main(void) int main(void)


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

Tema 7: Vectores y cadenas de caracteres


28
4

Paso de vectores unidimensionales


a funciones.
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.

Tema 7: Vectores y cadenas de caracteres


30
Paso de vectores unidimensionales a funciones

• 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.

Tema 7: Vectores y cadenas de caracteres


31
Paso de vectores unidimensionales a funciones
#include <stdio.h>
#define N 100
float Media(int a, float x[ ]); Prototipo de la función
int main(void)
{
int n;
float med; Parámetro real
float lista[N]; (nombre del vector)
………..
Dirección del primer elemento
med = Media(n, lista );
………
}
float Media(int a, float x[ ] ) /*definición de función*/
{
………. Parámetro formal
} (tipo del vector y corchetes)
Tema 7: Vectores y cadenas de caracteres
32
Paso de vectores unidimensionales a funciones
#include<stdio.h>
#define N 3
void Modificar(int x[ ]); Prototipo de la función

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]);
} Parámetro real: se pasa como argumento real la
return 0; dirección del primer elemento del vector, que viene
} determinada por el nombre de la variable vector, en
este caso a. Tema 7: Vectores y cadenas de caracteres
33
Paso de vectores unidimensionales a funciones

Parámetro formal: la variable x tomará en


cada llamada a la función la dirección del
void Modificar(int x[ ] ) primer elemento de la variable vector con
{ int i; que se le llame.

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]);
} 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.

Tema 7: Vectores y cadenas de caracteres


34
Paso de vectores unidimensionales a funciones
#include <stdio.h>
#define TAM 100
void Reordenar(int n, int x[ ]);
int main(void )
{ int i;
Comprobar que no se
int n; sobrepasa el tamaño del
int x[TAM]; vector
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;
}
Tema 7: Vectores y cadenas de caracteres
35
Paso de vectores unidimensionales a funciones

void Reordenar(int n, int x[ ])


Ejemplo de ordenación:
{
int k;
n=5
int i;
int temp;
3 4 1 9 2
for (k= 0; k< n-1; k++) {
for (i = k+1; i< n; i++) {
0 1 2 3 4
if (x[i] < x[k]) {
temp = x[k];
x[k] = x[i];
x[i] = temp;
}
}
}

Tema 7: Vectores y cadenas de caracteres


36
Sección 2

• Vectores multidimensionales: Matrices


• Paso de vectores multidimensionales a
funciones
5

Vectores multidimensionales:
Matrices
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];

Tema 7: Vectores y cadenas de caracteres


39
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
En todos estos casos
se consigue lo mismo
Ejemplo 1 int x[2][3] = {1,2,3,4,5,6};

x[0][0] = 1 x[0][1] = 2 x[0][2] = 3


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

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

Tema 7: Vectores y cadenas de caracteres


40
Vectores multidimensionales: Ejemplo
#include<stdio.h>
#define M 2
#define N 3

int main(void)
{
int x[M][N]= {{6,2, 0},{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”);
} Resultado:
return 0; 6, 2, 0,
}
3, 4, 1,

Tema 7: Vectores y cadenas de caracteres


41
Vectores multidimensionales: Ejemplo
#include<stdio.h>
#define NF 3
#define NC 4
Programa que lee y escribe una matriz
int main(void) bidimensional de 3 filas y 4 columnas
{
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;
}

Tema 7: Vectores y cadenas de caracteres


42
6

Paso de vectores multidimensionales a


funciones
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.

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


#include <stdio.h> void InicializaMatriz(int matriz[][M])
#define N 3 {
#define M 5 int n;
void InicializaMatriz(int matriz[][M]); int m;
int main (void) for (n=0; n<N; n++) {
{ for (m=0; m<M; m++) {
int mat[N][M]; matriz[n][m] = 0;
....... }
InicializaMatriz(mat); }
..... }
}

Tema 7: Vectores y cadenas de caracteres


44
Escuela Técnica Superior de Ingeniería ICAI
Alberto Aguilera 25
28015 Madrid
Tel +34 91 542 28 00
Fax + 34 91 542 31 76
Iwww.icai.comillas.edu

www.comillas.edu

También podría gustarte