PARTE 2 - CADENA DE CARACTERES
Ok tenia planeado dejarles algunos ejerccios para que practiquen toda la parte uno pero la parte 2 es algo corta asi que creo que les dare primero esta parte y luego los ejercicios
Bueno. Esta parte habla sobre "Cadena de Caracteres"
Una cadena de caracteres es el conjunto de numeros, letras y simbolos.
En C se llaman Arreglos de caracteres, donde arreglo es una estructuras de datos relacionados que reciben un nombre.
Los arreglos ocupan lugar en memoria. Cada caracter ocupa 1 byte.
Por ejemplo, si queremos guardar una cadena de caracteres con un nombre, se haria de la siguiente manera:
Código: Seleccionar todo
char nombre[15]; // Donde 15 son los bytes que se reservan y es la cantidad estimada de la cadena de caracteres
Es importante que si queremos guardar un nombre no pongamos que se reserven 100 bytes ya que un nombre no tendra eso y estaremos usando varios bytes para nada.
Si nosotros creamos una cadena de caracteres con una longitud maxima de 5 por ejemplo, y se ingresa una palabra de 8 caracteres, se guardaran los primeros 5 unicamente ya que 5 es la cantidad maxima que pusimos.
En toda la primera parte habiamos trabajado unicamente con numeros. Ahora vamos a ampliarnos un poco mas hacia lo que es cadena de caracteres y trabajar con letras tambien.
Vamos a hacer una aplicación que nos pregunte cual es nuestro nombre y que luego que lo ingresemos nos diga.. "Tu nombre es" y nuestro nombre.
En la parte 1 seccion B habiamos hablado de los tipos de variables en la cual mencionamos la cadena de caracteres y dijimos que su formato era %s.
Antes habiamos trabajado siempre con %d que es el formato de los numeros enteros.
Muy bien hagamos la aplicacion...
Código: Seleccionar todo
#include <stdio.h>
#include <conio.h>
char nombre[10];
main()
{
printf("Ingresa tu nombre...\n");
scanf("%s",nombre);
printf("\nTe llamas %s",nombre);
getch();
}
Fijense que a comparacion de como veniamos haciendo antes con los numeros, en el scanf no necesito poner el simbolo & antes del nombre del la variable en el cual quiero guardar el dato ingresado por el usuario.
Ok. Les pido que compilen esa aplicacion y pongan su nombre. SOLO SU NOMBRE y vean como les dice "Te llamas Pedro" por ejemplo.
Una vez que hayan hecho eso vamos a reservar mas bytes. Vamos a reservar unos 50. Por lo que la tercera linea quedaria:
Y vamos a escribir nuestro nombre y apellido completo..
¿Que sucede al hacer esto?
Seguramente han notado que cuando dejaron un espacio para poner su segundo nombre o su apellido no ha guardado el resto cierto? Ha guardado solo hasta que dejaron un espacio y el resto se ha "perdido".
Esto es porque C entiende un espacio como que ha terminado la cadena de caracteres y no guarda nada despues de eso.
Pero entonces... ¿Cómo hacemos para guardar una cadena de caracteres con espacios?
Para eso vamos a utilizar el siguiente formato al momento de hacer el scanf
Entre los corchetes se pueden enumerar todos los caracteres que se quieren entrar pero no es algo muy recomendado ya que son muchos caracteres entonces mejor se le indica cual es el que NO SE VA A CONSIDERAR, es decir el caracter que va a indicar fin de entrada de datos.
Para esto se coloca el simbolo ^ y el caracter de fin.
De este modo se considera todos menos el enter, y la entrada se corta con el enter.
MUY IMPORTANTE: Entre " y % dejar un espacio en blanco. De este modo siempre que se cargue un nuevo nombre se limpia el buffer de entrada de datos.
Todo esto se aplica al scanf. Luego para mostrar los datos en el printf se hace igual que lo hemos hecho siempre. Con el formato de las cadenas de caracteres que es %s y el nombre de la variable a mostrar.
Ahora si pueden poner si nombre y apellido y no tendran problemas para verlo. Aquí les dejo como quedaria el source:
Código: Seleccionar todo
#include <stdio.h>
#include <conio.h>
char nombre[50];
main()
{
printf("Ingresa tu nombre y apellido...\n");
scanf(" %[^\n]",nombre);
printf("\nTe llamas %s",nombre);
getch();
}
Ok.. pero con cadenas de caracteres tambien podemos realizar otras acciones como copiar, comparar, concatanear u otras...
Para ello debemos habilitar la biblioteca string.h por lo tanto ya se suma otra biblioteca a nuestro diccionario
En esta biblioteca estan definidas dichas funciones y solo debemos llamarlas y listo.
Si tenemos que asignar el valor de una variable char a otra char NO se utiliza el signi = como podria hacerse con los numeros enteros
En este caso debemos utilizar la funcion de la libreria string.h llamada strcpy()
Dicha funcion es:
Lo que hace esto es copiar el valor de la cadena de caracteres s2, en la cadena s1.
Hagamoslo con un ejemplo. Creemos dos variables del tipo char. Pidamos ingresar unicamente el nombre el cual lo almacenaremos en una variable. Luego con dicha funcion la copiaremos el valor de esa variable a la otra y la imprimiremos.
Código: Seleccionar todo
#include <stdio.h>
#include <conio.h>
#include <string.h>
char nom1[10], nom2[10];
main()
{
printf("Ingrese su nombre...\n");
scanf("%s",nom1);
strcpy(nom2,nom1);
printf("Tu nombre es %s",nom2);
getch();
}
En primer lugar como veran se agrego la linea:
Luego se le pidio al usuario que introduzca un nombre cuyo valor se guardo en la variable nom1.
Luego con la funcion strcpy copiamos el valor de nom1 en nom2 y finalmente imprimimos nom2 y dejamos congelada la aplicación.
Pero que pasa si queremos copiar solo parte de una variable en otra?. Por ejemplo solo los primeros 3 caracteres?
En ese caso se haria de este modo:
Como veran se le pasa un tercer parametro con la cantidad de caracteres a copiar.
Vamos a reemplazar en el ejemplo que hicimos anteriormente las siguientes lineas:
Y vamos a poner.
Código: Seleccionar todo
strcpy(nom2,nom1,3);
printf("Las 3 primeras letras de tu nombre son %s y tu nombre completo es %s",nom2,nom1);
Y ahora pruebenlo nuevamente.
Ahora bien. Como comparamos si una variable es igual a otra?
Para esto utilizamos otra fucion incluida dentro de string.h que es strcmp()
Por ejemplo:
Esto comara la cadena s1 con s2 y devuelve un valor entero.
Devuelve 0 si ambas son iguales, < 0 si S1 es menor a S2 y > 0 si S1 es mayor a S2.
Pero.. que significa que S1 es mayor o menor a S2?
Todos los caracteres se corresonden a un codigo universal como ASCII o EBCDIC donde siguen el orden alfanumerico. Esto permite ir comparando caracter por caracter y si sus codigos son iguales devuelve un 0. Si el caracter de S1 es anterior al de S2 devuelve < 0 y si es posterior > 0.
NADA
NULO
N y N so iguales. Entonces compara el siguiente. A esta antes que U es decir el codigo ASCII de la A es menor al de la U o sea al restarlos da negativo, no compara mas y devuelve < 0
ESPECIE
ESPECIAL
Hasta la I compara caracter por caracter y todos son iguales. Pero luego la E esta despues que la A, osea que al restarlos da positivo. Ahi no compara mas y devuelve > 0
Ahora vamos a hacer una aplicacion que pida ingresar 2 nombres y compare si son iguales no.
Código: Seleccionar todo
#include <stdio.h>
#include <conio.h>
#include <string.h>
char n1[10],n2[10];
main()
{
printf("Ingrese un nombre:\n");
scanf("%s",n1);
printf("\nIngrese otro nombre:\n");
scanf("%s",n2);
if(strcmp(n1,n2)==0)
{
printf("\nLos nombres son iguales");
}else
{
printf("\nLos nombres son distintos");
}
getch();
}
Bueno. Con esto terminamos la segunda parte. Como dije era algo corta. Asi que ahora si les pondre ejercicios de la primera y segunda parte para que los hagan y vean si van bien para la tercera...