23 - Estructura de datos tipo matriz (elementos char)


Las matrices de tipo de dato char se utilizan fundamentalmente para guardar un conjunto de cadenas de caracteres (varios nombres de personas, nombres de artículos etc.)

Cuando trabajamos una matriz de tipo char para almacenar cadenas de caracteres cada fila almacena un string:

matrices de tipo char en lenguaje C

Para trabajar una matriz de tipo char se parece a trabajar con un vector, debemos indicar un solo subíndice y estaremos accediendo a toda la fila.

Problema 1:

Confeccionar un programa que permita ingresar en una matriz de tipo char los nombres de artículos para la venta. Hacer luego una función que imprima los nombres de dichos artículos.

Programa: programa120.c

Ver video

#include<stdio.h>
#include<conio.h>

void cargar(char articulos[3][31])
{
    int f;
    for(f=0;f<3;f++)
    {
        printf("Ingrese el nombre del articulo:");
        gets(articulos[f]);
    }
}

void imprimir(char articulos[3][31])
{
    int f;
    printf("Listado completo de articulos\n");
    for(f=0;f<3;f++)
    {
        printf("%s\n",articulos[f]);
    }
}


int main()
{
    char articulos[3][31];
    cargar(articulos);
    imprimir(articulos);
    getch();
    return 0;
}

En la función main definimos una matriz de 3 filas y 31 columnas de tipo char. Con esta definición podemos almacenar tres nombres de artículos de hasta 30 caracteres de información cada uno, recordemos que se requiere el '\0' (terminador de cadena) para cada string:

int main()
{
    char articulos[3][31];
    cargar(articulos);
    imprimir(articulos);
    getch();
    return 0;
}

En la función de carga disponemos un solo for ya que vamos a cargar una fila completa cada vuelta del for, debemos indicar un solo subíndice a la matriz que representa la fila que estamos cargando:

void cargar(char articulos[3][31])
{
    int f;
    for(f=0;f<3;f++)
    {
        printf("Ingrese el nombre del articulo:");
        gets(articulos[f]);
    }
}

De forma similar en la impresión nuevamente indicamos solo un subíndice:

void imprimir(char articulos[3][31])
{
    int f;
    printf("Listado completo de articulos\n");
    for(f=0;f<3;f++)
    {
        printf("%s\n",articulos[f]);
    }
}

Problema 2:

Confeccionar un programa que permita :
1-Almacenar en una matriz los datos de 5 personas.
2-Imprimir los nombres.
3-Ingresar otro nombre y verificar si se encuentra almacenado en la matriz.

Programa: programa121.c

Ver video

#include<stdio.h>
#include<conio.h>
#include<string.h>

void cargar(char nombres[5][41])
{
    int f;
    for(f=0;f<5;f++)
    {
        printf("Ingrese el nombre de persona:");
        gets(nombres[f]);
    }
}

void imprimir(char nombres[5][41])
{
    int f;
    printf("Listado completo de nombres\n");
    for(f=0;f<5;f++)
    {
        printf("%s\n",nombres[f]);
    }
}

void consulta(char nombres[5][41])
{
    int f;
    char nom[41];
    int existe=0;
    printf("Ingrese un nombre para buscarlo:");
    gets(nom);
    for(f=0;f<5;f++)
    {
        if (strcmp(nom,nombres[f])==0)
        {
            existe=1;
        }
    }
    if (existe==1)
    {
        printf("El nombre se encuentra almacenado en la matriz.");
    }
    else
    {
        printf("El nombre no se encuentra almacenado en la matriz.");
    }
}


int main()
{
    char nombres[5][41];
    cargar(nombres);
    imprimir(nombres);
    consulta(nombres);
    getch();
    return 0;
}

En la función main definimos la matriz de tipo char que permite almacenar 5 palabras de hasta 40 caracteres de información:

int main()
{
    char nombres[5][41];
    cargar(nombres);
    imprimir(nombres);
    consulta(nombres);
    getch();
    return 0;
}

Tanto cuando cargamos como cuando imprimimos los cinco nombres hacemos referencia a un solo subíndice:

void cargar(char nombres[5][41])
{
    int f;
    for(f=0;f<5;f++)
    {
        printf("Ingrese el nombre de persona:");
        gets(nombres[f]);
    }
}

void imprimir(char nombres[5][41])
{
    int f;
    printf("Listado completo de nombres\n");
    for(f=0;f<5;f++)
    {
        printf("%s\n",nombres[f]);
    }
}

Lo más interesante de este problema esta en la búsqueda de un nombre dentro de la matriz:

void consulta(char nombres[5][41])

Definimos un vector de caracteres donde el operador ingresará el nombre a buscar:

    char nom[41];

Como se trata de un vector de caracteres no indicamos un subíndice en la carga por teclado:

    gets(nom);

Disponemos un for para controlar cada una de las filas de la matriz si coincide con el nombre ingresado previo al for:

    for(f=0;f<5;f++)
    {
        if (strcmp(nom,nombres[f])==0)
        {
            existe=1;
        }
    }

Es importante recordar que debemos utilizar la función strcmp para comparar dos cadenas de caracteres (el vector nom y la fila de la matriz)

Utilizamos una variable entera donde almacenamos un cero previo a buscarlo y si encontramos la palabra dentro de la matriz procedemos a cargar en la variable existe un uno.
Cuando sale del for según el estado de la variable podemos indicar si la palabra se encuentra en la matriz:

    if (existe==1)
    {
        printf("El nombre se encuentra almacenado en la matriz.");
    }
    else
    {
        printf("El nombre no se encuentra almacenado en la matriz.");
    }

Problema 3:

Confeccionar un programa que permita :
1-Almacenar en una matriz los datos de 5 personas.
2-Imprimir los nombres.
3-Ordenar alfabéticamente los nombres.

Programa: programa122.c

Ver video

#include<stdio.h>
#include<conio.h>
#include<string.h>

void cargar(char nombres[5][41])
{
    int f;
    for(f=0;f<5;f++)
    {
        printf("Ingrese el nombre de persona:");
        gets(nombres[f]);
    }
}

void imprimir(char nombres[5][41])
{
    int f;
    printf("Listado completo de nombres\n");
    for(f=0;f<5;f++)
    {
        printf("%s\n",nombres[f]);
    }
}

void ordenar(char nombres[5][41])
{
    int k,f;
    char aux[41];
    for (k = 0; k < 4; k++)
    {
        for (f = 0; f < 4 - k; f++)
        {
            if (strcmp(nombres[f],nombres[f+1]) > 0)
            {
                strcpy(aux,nombres[f]);
                strcpy(nombres[f],nombres[f + 1]);
                strcpy(nombres[f + 1],aux);
            }
        }
    }
}


int main()
{
    char nombres[5][41];
    cargar(nombres);
    imprimir(nombres);
    ordenar(nombres);
    imprimir(nombres);
    getch();
    return 0;
}

Para ordenar todas las filas de una matriz de caracteres debemos plantear el algoritmo de ordenamiento que vimos anteriormente.
Como no está definido el operador == utilizamos la función strcmp:

            if (strcmp(nombres[f],nombres[f+1]) > 0)

Recordemos que strcmp retorna un valor mayor a cero si el primer parámetro es mayor alfabéticamente que el segundo.

Tampoco tenemos definido el operador de asignación con string por lo que utilizamos la función strcpy para el proceso de intercambio de nombres en la matriz:

                strcpy(aux,nombres[f]);
                strcpy(nombres[f],nombres[f + 1]);
                strcpy(nombres[f + 1],aux);

Problema propuesto

Solución
programa123.c

#include<stdio.h>
#include<conio.h>
#include<string.h>

void cargar(char nombres[5][41])
{
    int f;
    for(f=0;f<5;f++)
    {
        printf("Ingrese el nombre de persona:");
        gets(nombres[f]);
    }
}

void imprimir(char nombres[5][41])
{
    int f;
    printf("Listado completo de nombres\n");
    for(f=0;f<5;f++)
    {
        printf("%s\n",nombres[f]);
    }
}

void menor(char nombres[5][41])
{
    int f;
    char men[41];
    strcpy(men,nombres[0]);
    for(f=1;f<5;f++)
    {
        if (strcmp(nombres[f],men) < 0)
        {
            strcpy(men,nombres[f]);
        }
    }
    printf("Nombre menor alfabeticamente: %s",men);
}


int main()
{
    char nombres[5][41];
    cargar(nombres);
    imprimir(nombres);
    menor(nombres);
    getch();
    return 0;
}




Retornar