PROGRAMACIÓN EN C. 3ª EVALUACIÓN
Los vectores nos permiten almacenar una serie de
datos en una única variable. Son como una cajonera en cada uno de cuyos cajones
podemos guardar un dato. Todos los datos deben ser del mismo tipo.
Por ejemplo, si queremos almacenar veinte números, con lo que
sabemos hasta ahora habríamos diseñado algo similar a:
…
{ int numero1,numero2,numero3,numero4…;
printf(“Dame el primer número”);scanf(“%d”,&numero1);
printf(“Dame el segundo número”);scanf(“%d”,&numero2);
…
En vez de ello podemos, usando un vector, llamar a la
variable vector, por ejemplo, numeros, y referirnos al numero[0], al numero[1],
al numero[2], etc., ya sea para introducirlos o, posteriormente, para operar con
ellos o mostrarlos en pantalla.
Un vector se define de forma parecida a los demás tipos de
variables: indicamos su tipo, el nombre que le damos, y señalamos a
continuación, entre corchetes, el número de elementos que en él vamos a
almacenar.
Sintaxis: tipo nombrevector[nº de posiciones]; donde tipo es cualquiera de los tipos de datos conocidos: entero (int), real (float), o carácter (char).
Para introducir un valor en una determinada posición, indicamos esta entre corchetes. Por ejemplo, si queremos meter en la posición 2 de un vector de enteros, de nombre datos, el número 35, escribiríamos: datos[1]=35;
Para mostrar el dato almacenado en la posición, por ejemplo, 15, escribríamos: printf(“%d”,datos[14]);
En el ejemplo se observa que la primera posición es siempre la 0 y no la 1.
Podemos definir y asignar valores, conjuntamente, a las distintas posiciones de un vector, en la forma:
tipo nombrevector[n]={dato1,dato2,dato3,…,daton};
Cuando el número de elementos es elevado, lo que se hace es ir introduciendo los datos, o visualizándolos, con la ayuda de un bucle, que haga que una variable (índice), vaya tomando los valores de cada una de las posiciones del vector.
Los arrays pueden ser de más de una dimensión. Podemos imaginar un array bidimensional como una tabla con filas y columnas. Por ejemplo, un array bidimensional para introducir los días de la semana sería de 9 columnas (el miércoles es el día de más caracteres, con 9) y siete filas, una para cada día. La definición sería:
char semana[7][9]={"lunes","martes","miércoles","jueves","viernes","sábado","domingo"};
Se almacenarían en la forma:
C O L U M N A S | ||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
F I L A S | 0 | L | U | N | E | S | û | û | û | û |
1 | M | A | R | T | E | S | û | û | û | |
2 | M | I | E | R | C | O | L | E | S | |
3 | J | U | E | V | E | S | û | û | û | |
4 | V | I | E | R | N | E | S | û | û | |
5 | S | A | B | A | D | O | û | û | û | |
6 | D | O | M | I | N | G | O | û | û |
en donde û es el símbolo correspondiente al carácter nulo: \0
Los arrays de caracteres tienen sus propias funciones, que trataremos más adelante. Por ahora, podemos tratarlos de forma similar a los de tipo entero o real.
Podemos mejorar la presentación si limitamos el número de caracteres que se deben imprimir (9 como máximo, si es que no encontramos antes el carácter nulo):
#include <stdio.h> void main() {char semana[7][9]={"lunes","martes","miércoles","jueves","viernes", "sábado","domingo"}; int n,m; for (n=0;n<7;n=n+1) {for (m=0;m<9;m=m+1) if (semana[n][m]!='\0') printf("%c",semana[n][m]); printf("\n"); } } |
Consiste en ir comparando, desde el primero al penúltimo, cada posición del array con la siguiente. Si están ordenados, se compara el último de los dos con el que le sigue, y así sucesivamente. Al llegar a una pareja que esté desordenada, se intercambian sus valores y se continúa. Cuando llegamos a comparar el penúltimo con el último, si alguna pareja estaba desordenada y hubo que cambiar sus valores, se empieza de nuevo todo el proceso. Se da por concluída la ordenación cuando se recorre toda la lista y no hemos encontrado ninguna pareja desordenada.
El método de la burbuja es el más sencillo de entender pero existen métodos más rápidos, especialmente cuando el número de datos que queremos ordenar es elevado.
Se declaran se forma similar a los otros tipos de arrays: char nombrevariable[nºposiciones];
El compilador introduce automáticamente, en la posición siguiente al último carácter, el carácter nulo \0 Por esta razón es necesario definir una posición más de las que necesitemos.
Por ejemplo, si queremos almacenar un nombre, para el que reservamos un máximo de 11 caracteres, escribiríamos: char nombre[12]; Si en este array almacenamos el nombre ANA, se guardaría como:
Y si fuese el término MEDITERRÁNEO, se produciría un error debido a que no hemos reservado el espacio para el carácter nulo.
Para introducir los caracteres, podemos:
escribirlos como cadena literal: char nombrearray[]=”cadena”;
en cuyo caso el compilador reserva automáticamente las posiciones necesarias y además incluye al final el carácter nulo \0
escribirlos carácter a carácter, entre llaves y separados por comillas sencillas:
char nombrearray[nºposiciones]={‘carácter1’,’carácter2’,…,’\0’};
teniendo entonces que reservar el número de posiciones necesario e incluir al final el carácter nulo
pedirlos al usuario mediante gets(nombrearray), como veremos a continuación en las funciones de cadena.
printf(); Su sintaxis es la misma que vimos al hablar de los tipos entero, real y char:
printf(“cadena de formato”,nombrearray); El especificador de formato del tipo cadena es %s
Ejemplo:
#include <stdio.h>
void main()
{ char texto[]="Colegio";
printf("El texto es %s",texto);
}
gets(); Es la función equivalente a scanf(); Permite introducir la cadena por teclado.
Sintaxis: gets(nombrearray);
El array debe haber sido definido con un número de posiciones adecuado, de forma que en él quepan la cadena y el carácter nulo.
getch(); y getche(); Ambas funciones fueron estudiadas. Nos permitían tomar pulsaciones del teclado. Podemos usarlas para ir tomando una cadena carácter a carácter. Habrá que limitar el número de caracteres dependiendo de las posiciones que pusiésemos en la declaración del array, y después del último carácter, hay que meter el carácter nulo.
Ambas se encuentran en el fichero de cabecera conio.h
Otras funciones de tratamiento de cadenas (strings).
Todas ellas están incluídas en el fichero de cabecera string.h
strcat(); Concatena dos cadenas. Sintaxis: strcat(cadenadestino,cadenaorigen);
La cadena destino debe ser lo suficientemente grande como para poder contener a la cadena origen, que se pondrá después del último carácter, si es que lo hay, de la destino.
#include <stdio.h> #include <string.h> void main() { char origen[10],destino[25]; printf("¿Cadena destino?");gets(destino); printf("¿Segunda origen?");gets(origen); strcat(destino,origen); printf("En cadena destino hay %s",destino); } |
strcmp(); Sintaxis: variable_entera=strcmp(cadena1,cadena2);
Compara dos cadenas, devolviendo:
0 si son iguales
<0 si el código ASCII del carácter diferenciador de la primera cadena es menor que el de la segunda.
>0 si el código ASCII del carácter diferenciador de la primera cadena es mayor que el de la segunda.
strcpy(); Sintaxis: strcpy(cadenadestino,cadenaorigen);
Copia la cadena origen en la cadena destino. Esta deberá tener el tamaño adecuado para contener a la primera.
strlen(); Sintaxis: variable_entera=strlen(cadena);
Mide la longitud (el nº de caracteres) de una cadena. Los espacios en blanco también son caracteres