19 - Funciones con parámetros de tipo vector


Vimos en conceptos anteriores que un vector en el lenguaje C es una estructura de datos que permite almacenar un CONJUNTO de datos del MISMO tipo. Con un único nombre se define el vector y por medio de un subíndice hacemos referencia a cada elemento del mismo (componente)

Ahora veremos que una función puede recibir como parámetros tipos de dato vector.

Importante

Lo más importante de un vector que cuando se pasa como parámetro a una función no se hace una copia como sucede con los tipos de dato char, int y float sino se pasa la dirección de memoria donde se almacena el vector original.

Esta forma de pasaje de datos tipo vector hace que si modificamos el parámetro dentro de la función lo que sucede es que se modifica la variable definida en la función main o donde se haya definido.

Problema 1:

Confeccionar un programa que defina dos funciones, una que permita cargar un vector de 5 elementos enteros y otra que muestre un vector de 5 elementos enteros.
En la función main definir una variable de tipo vector y seguidamente llamar a las dos funciones.

Programa: programa101.c

Ver video

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

void cargar(int vec[5])
{
    int x;
    for(x=0;x<5;x++)
    {
        printf("Ingrese elemento:");
        scanf("%i",&vec[x]);
    }
}

void imprimir(int vec[5])
{
    int x;
    printf("Contenido completo del vector:");
    for(x=0;x<5;x++)
    {
        printf("%i ",vec[x]);
    }
}


int main()
{
    int vector[5];
    cargar(vector);
    imprimir(vector);
    getch();
    return 0;
}

La sintaxis para definir un parámetro de tipo vector es similar a cuando definimos un vector indicando entre corchetes la cantidad de elementos del mismo:

void cargar(int vec[5])

En la main definimos un vector de 5 elementos y se lo pasamos a la función cargar:

    int vector[5];
    cargar(vector)

Debe quedar claro que cuando pasamos la variable vector el parámetro vec no recibe una copia de vector sino que guarda la referencia de memoria de la variable vector (cuando cargamos enteros en el parámetro vec estamos cargando la variable vector definida en la main):

parametros de tipo vector en C

El algoritmo completo de la función cargar:

void cargar(int vec[5])
{
    int x;
    for(x=0;x<5;x++)
    {
        printf("Ingrese elemento:");
        scanf("%i",&vec[x]);
    }
}

La función imprimir recibe el vector (si bien este algoritmo no lo modifica en el caso que lo haga estará modificando la variable definida en la función main):

void imprimir(int vec[5])
{
    int x;
    printf("Contenido completo del vector:");
    for(x=0;x<5;x++)
    {
        printf("%i ",vec[x]);
    }
}

La función main define un vector y llama primero a la función de cargar el vector y seguidamente la función que lo imprime:

int main()
{
    int vector[5];
    cargar(vector);
    imprimir(vector);
    getch();
    return 0;
}

Problema 2:

Guardar los datos de 6 sueldos de empleados en un vector de tipo float. Confeccionar las siguientes funciones:
1-Carga de sueldos.
2-Impresión de los sueldos.
3-Gasto total de la empresa en sueldos.

Programa: programa102.c

Ver video

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

void cargar(float sueldos[6])
{
    int x;
    for(x=0;x<6;x++)
    {
        printf("Ingrese el sueldo:");
        scanf("%f",&sueldos[x]);
    }
}

void imprimir(float sueldos[6])
{
    int x;
    printf("Listado completo de sueldos\n");
    for(x=0;x<6;x++)
    {
        printf("%0.2f\n",sueldos[x]);
    }
}

void calcularGastos(float sueldos[6])
{
    float total=0;
    int x;
    for(x=0;x<6;x++)
    {
        total=total+sueldos[x];
    }
    printf("Gasto total en sueldos de la empresa:%0.2f",total);
}


int main()
{
    float sueldos[6];
    cargar(sueldos);
    imprimir(sueldos);
    calcularGastos(sueldos);
    getch();
    return 0;
}

En la función main definimos un vector de 6 elementos de tipo float. Este vector se lo pasamos sucesivamente a las distintas funciones para que lo cargue, imprima y sume:

int main()
{
    float sueldos[6];
    cargar(sueldos);
    imprimir(sueldos);
    calcularGastos(sueldos);
    getch();
    return 0;
}

La función que carga el vector de sueldos tiene un parámetro de tipo float de 6 elementos que se llama sueldos, no hay problemas si el parámetro tiene otro nombre:

void cargar(float sueldos[6])
{
    int x;
    for(x=0;x<6;x++)
    {
        printf("Ingrese el sueldo:");
        scanf("%f",&sueldos[x]);
    }
}

Luego tenemos la función que imprime todas sus componentes:

void imprimir(float sueldos[6])
{
    int x;
    printf("Listado completo de sueldos\n");
    for(x=0;x<6;x++)
    {
        printf("%0.2f\n",sueldos[x]);
    }
}

Finalmente tenemos otra función que recibe el vector y procede a sumar todas sus componentes y mostrar dicho valor:

void calcularGastos(float sueldos[6])
{
    float total=0;
    int x;
    for(x=0;x<6;x++)
    {
        total=total+sueldos[x];
    }
    printf("Gasto total en sueldos de la empresa:%0.2f",total);
}

Problema 3:

Definir tres vectores de tipo entero. Realizar la carga de los dos primeros por teclado. Definir una única función que realice la carga de un vector y llamar a dicha función dos veces pasando el primer y segundo vector definido.
Plantear otra función que reciba tres vectores y proceda a sumar elemento a elementos los dos primeros vectores y se carguen en el tercer vector.
Imprimir los tres vectores.

Programa: programa103.c

Ver video

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

void cargar(int vec[5])
{
    int x;
    printf("Carga de un vector.\n");
    for(x=0;x<5;x++)
    {
        printf("Cargar elemento:");
        scanf("%i",&vec[x]);
    }
}

void generarVector(int vec1[5],int vec2[5],int vecsuma[5])
{
    int x;
    for(x=0;x<5;x++)
    {
        vecsuma[x]=vec1[x]+vec2[x];
    }
}

void imprimir(int vec[5])
{
    int x;
    printf("Impresion del vector:");
    for(x=0;x<5;x++)
    {
        printf("%i ",vec[x]);
    }
    printf("\n");
}


int main()
{
    int vector1[5];
    int vector2[5];
    int vecsuma[5];
    cargar(vector1);
    cargar(vector2);
    generarVector(vector1,vector2,vecsuma);
    imprimir(vector1);
    imprimir(vector2);
    imprimir(vecsuma);
    getch();
    return 0;
}

Es interesante ver en este problema que la función cargar la podemos reutilizar para cargar distintos vectores de 5 enteros, desde la función main llamamos dos veces a dicha función pasando primero a vector1 y luego a vector2:

int main()
{
    int vector1[5];
    int vector2[5];
    int vecsuma[5];
    cargar(vector1);
    cargar(vector2);

Acá queda claro que el nombre del parámetro de la función puede tener un nombre distinto a la variable que le pasamos desde la main:

void cargar(int vec[5])
{
    int x;
    printf("Carga de un vector.\n");
    for(x=0;x<5;x++)
    {
        printf("Cargar elemento:");
        scanf("%i",&vec[x]);
    }
}

Otro de los puntos que debe resolver el problema es la generación de un tercer vector a partir de la suma de las componentes de la misma posición de los dos primeros vectores:

void generarVector(int vec1[5],int vec2[5],int vecsuma[5])
{
    int x;
    for(x=0;x<5;x++)
    {
        vecsuma[x]=vec1[x]+vec2[x];
    }
}

Nuevamente la función imprimir nos sirva para mostrar cualquier vector de 5 elementos de tipo entero:

void imprimir(int vec[5])
{
    int x;
    printf("Impresion del vector:");
    for(x=0;x<5;x++)
    {
        printf("%i ",vec[x]);
    }
    printf("\n");
}

Desde la main llamamos a esta función tres veces pasando uno a uno cada vector que queremos imprimir:

int main()
{
    int vector1[5];
    int vector2[5];
    int vecsuma[5];
    cargar(vector1);
    cargar(vector2);
    generarVector(vector1,vector2,vecsuma);
    imprimir(vector1);
    imprimir(vector2);
    imprimir(vecsuma);

Problema 4:

Confeccionar dos funciones:
1-Permita ingresar por teclado una palabra en un vector de caracteres que llega como parámetro.
2-Retornar la cantidad de vocales que tiene la palabra.

Programa: programa104.c

Ver video

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

void cargar(char palabra[40])
{
    printf("Ingrese una palabra:");
    gets(palabra);
}

int cantidadDeVocales(char palabra[40])
{
    int cant=0;
    int x=0;
    while(palabra[x]!='\0')
    {
        if (palabra[x]=='a' || palabra[x]=='e' || palabra[x]=='i' || palabra[x]=='o' || palabra[x]=='u' ||
            palabra[x]=='A' || palabra[x]=='E' || palabra[x]=='I' || palabra[x]=='O' || palabra[x]=='U')
        {
            cant++;
        }
        x++;
    }
    return cant;
}


int main()
{
    char pal[40];
    cargar(pal);
    printf("La cantidad de vocales que tiene la palabra: %s es de %i",pal, cantidadDeVocales(pal));
    getch();
    return 0;
}

Los parámetros de tipo vector con elementos de tipo char funcionan igual que los vectores con elementos int o float. Si modificamos el parámetro estamos modificando la variable que le pasamos desde la main.

La función que carga la palabra recibe como parámetro el vector de caracteres y lo modifica:

void cargar(char palabra[40])
{
    printf("Ingrese una palabra:");
    gets(palabra);
}

La segunda función recibe un vector de caracteres con información y procede a analizar cada caracter contando cada vez que hay una vocal. La función finalmente mediante un return devuelve la cantidad de vocales de la palabra:

int cantidadDeVocales(char palabra[40])
{
    int cant=0;
    int x=0;
    while(palabra[x]!='\0')
    {
        if (palabra[x]=='a' || palabra[x]=='e' || palabra[x]=='i' || palabra[x]=='o' || palabra[x]=='u' ||
            palabra[x]=='A' || palabra[x]=='E' || palabra[x]=='I' || palabra[x]=='O' || palabra[x]=='U')
        {
            cant++;
        }
        x++;
    }
    return cant;
}

Desde la función main llamamos a las dos funciones:

int main()
{
    char pal[40];
    cargar(pal);
    printf("La cantidad de vocales que tiene la palabra: %s es de %i",pal, cantidadDeVocales(pal));
    getch();
    return 0;
}

Problemas propuestos

Solución
programa105.c

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

void cargar(float alturas[5])
{
    int x;
    for(x=0;x<5;x++)
    {
        printf("Ingrese altura de la persona:");
        scanf("%f",&alturas[x]);
    }
}

float calcularPromedio(float alturas[5])
{
    float suma=0;
    float promedio;
    int x;
    for(x=0;x<5;x++)
    {
        suma=suma+alturas[x];
    }
    promedio=suma/5;
    return promedio;
}

void altasBajas(float alturas[5],float pro)
{
    int x;
    int altos=0;
    int bajos=0;
    for(x=0;x<5;x++)
    {
        if (alturas[x]>pro)
        {
            altos++;
        }
        else
        {
            if (alturas[x]<pro)
            {
                bajos++;
            }
        }
    }
    printf("Cantidad de personas mas altas al promedio es: %i\n",altos);
    printf("Cantidad de personas mas bajas al promedio es: %i",bajos);
}


int main()
{
    float alturas[5];
    float prom;
    cargar(alturas);
    prom=calcularPromedio(alturas);
    printf("Altura promedio de las personas:%0.2f\n",prom);
    altasBajas(alturas,prom);
    getch();
    return 0;
}




programa106.c

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

void cargar(float sueldos[4])
{
    int x;
    for(x=0;x<4;x++)
    {
        printf("Ingrese sueldo:");
        scanf("%f",&sueldos[x]);
    }
}

float gastosTurno(float sueldos[4])
{
    float total=0;
    int x;
    for(x=0;x<4;x++)
    {
        total=total+sueldos[x];
    }
    return total;
}


int main()
{
    float sueldosMa[4];
    float sueldosTar[4];
    printf("Carga de sueldos del turno manana\n");
    cargar(sueldosMa);
    printf("Carga de sueldos del turno tarde\n");
    cargar(sueldosTar);
    printf("Gastos del turno de la manana: %0.2f\n", gastosTurno(sueldosMa));
    printf("Gastos del turno de la tarde: %0.2f", gastosTurno(sueldosTar));
    getch();
    return 0;
}




programa107.c

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

void cargar(int vector[8])
{
    int x;
    for(x=0;x<8;x++)
    {
        printf("Ingrese elemento del vector:");
        scanf("%i",&vector[x]);
    }
}

int sumar(int vector[8])
{
    int x;
    int suma=0;
    for(x=0;x<8;x++)
    {
        suma=suma+vector[x];
    }
    return suma;
}

int sumaMayores36(int vector[8])
{
    int x;
    int suma=0;
    for(x=0;x<8;x++)
    {
        if (vector[x]>36)
        {
            suma=suma+vector[x];
        }
    }
    return suma;
}

int cantidadMayores50(int vector[8])
{
    int x;
    int cant=0;
    for(x=0;x<8;x++)
    {
        if (vector[x]>50)
        {
            cant++;
        }
    }
    return cant;
}


int main()
{
    int vector[8];
    cargar(vector);
    printf("valor acumulado de todos los elementos:%i\n", sumar(vector));
    printf("valor acumulado de los elementos del vector que sean mayores a 36: %i\n", sumaMayores36(vector));
    printf("cantidad de componentes con valores mayores a 50: %i", cantidadMayores50(vector));
    getch();
    return 0;
}




programa108.c

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

void cargar(int curso[5])
{
    int x;
    for(x=0;x<5;x++)
    {
        printf("Ingrese nota:");
        scanf("%i",&curso[x]);
    }
}

int promedio(int curso[5])
{
    int x;
    int suma=0;
    for(x=0;x<5;x++)
    {
        suma=suma+curso[x];
    }
    int promedio=suma/5;
    return suma;
}


int main()
{
    int cursoA[5];
    int cursoB[5];
    printf("Carga del curso A\n");
    cargar(cursoA);
    printf("Carga del curso B\n");
    cargar(cursoB);
    if (promedio(cursoA)>promedio(cursoB))
    {
        printf("Curso A con promedio de notas mayor.");
    }
    else
    {
        if (promedio(cursoB)>promedio(cursoA))
        {
            printf("Curso B con promedio de notas mayor.");
        }
    }
    getch();
    return 0;
}




programa109.c

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

void cargar(int vec[10])
{
    int x;
    for(x=0;x<10;x++)
    {
        printf("Ingrese elemento:");
        scanf("%i",&vec[x]);
    }
}

void estaOrdenado(int vec[10])
{
    int x;
    int ordenado=1;
    for(x=0;x<9;x++)
    {
        if (vec[x+1]<vec[x])
        {
            ordenado=0;
        }
    }
    if (ordenado==1)
    {
        printf("Los elementos del vector estan ordenados");
    }
    else
    {
        printf("Los elementos del vector no estan ordenados");
    }
}


int main()
{
    int vector[10];
    cargar(vector);
    estaOrdenado(vector);
    getch();
    return 0;
}


Retornar