26 - Directiva #define


La directiva #define especifica un nombre que será reemplazado por un cierto valor en todos los lugares del programa donde se haga referencia a dicho nombre.

Se crean fuera de cualquier función normalmente en la parte inicial del archivo luego de las directivas #include. La sintaxis es la siguiente:

#define [nombre de la macro]  [valor de la macro]

Un ejemplo concreto es:

#define TAMANO 20
#define MENSAJEFIN "Presione una tecla para finalizar"

El nombre de la macro es común que se lo escriba con caracteres mayúsculas (es una regla que utilizan muchos programadores pero no es obligatoria)

Luego de especificar el nombre de la macro hay uno o más espacios en blanco y debemos especificar el valor de la macro.

El primer paso del compilador es reemplazar todas las partes del programa donde hay declaradas macros por los valores de dichas macros.

El uso excesivo de macros puede tornar muy difícil el mantenimiento de programas.

Problema 1:

Se desea guardar los sueldos de 5 operarios.
Desarrollar dos funciones una donde se los ingrese por teclado y otra función donde se los imprima.
Definir una macro para indicar el tamaño del vector.

Programa: programa129.c

Ver video

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

#define TAMANO 5
#define FINPROGRAMA "Gracias por utilizar nuestro programa"
void cargar(float sueldos[TAMANO])
{
    int f;
    for(f=0;f<TAMANO;f++)
    {
        printf("Ingrese sueldo:");
        scanf("%f",&sueldos[f]);
    }
}

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


int main()
{
    float sueldos[TAMANO];
    cargar(sueldos);
    imprimir(sueldos);
    printf(FINPROGRAMA);
    getch();
    return 0;
}

En este programa hemos definido dos macros llamadas TAMANO y FINPROGRAMA:

#define TAMANO 5
#define FINPROGRAMA "Gracias por utilizar nuestro programa"

En la función main definimos un vector cuyo subíndice disponemos el nombre de la macro y un printf que pasamos en su parámetro la macro FINPROGRAMA:

int main()
{
    float sueldos[TAMANO];
    cargar(sueldos);
    imprimir(sueldos);
    printf(FINPROGRAMA);
    getch();
    return 0;
}

Hay que tener en cuenta que cuando compilamos este programa lo primero que hace es sustituir todas las macros por los valores de las macros, es decir la función main en la primer etapa de sustitución queda igual a:

int main()
{
    float sueldos[5];
    cargar(sueldos);
    imprimir(sueldos);
    printf("Gracios por utilizar nuestro programa");
    getch();
    return 0;
}

Es decir el subíndice del vector es sustituido por un 5 y el parámetro del printf es sustituido por el valor "Gracias por utilizar nuestro programa"

En las otras funciones también utilizamos la macro TAMANO:

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

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

Como ventaja si tenemos que modificar nuestro programa y trabajar con los sueldos de 8 empleados el único cambio que tenemos que hacer es modificar el valor de la macro TAMANO.

Problema propuesto

Solución
programa130.c

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

#define CANTEMPLEADOS 4
#define MESES 3

void cargar(char empleados[CANTEMPLEADOS][40],float sueldos[CANTEMPLEADOS][MESES])
{
    int f,c;
    for(f=0;f<CANTEMPLEADOS;f++)
    {
        printf("Ingrese el nombre del empleado:");
        gets(empleados[f]);
        for(c=0;c<MESES;c++)
        {
            printf("Ingrese sueldo:");
            scanf("%f",&sueldos[f][c]);
            fflush(stdin);
        }
    }
}

void calcularSumaSueldos(float sueldos[CANTEMPLEADOS][MESES],float sueldostot[CANTEMPLEADOS])
{
    int f,c;
    float suma;
    for (f=0;f<CANTEMPLEADOS;f++)
    {
        suma=0;
        for(c=0;c<MESES;c++)
        {
            suma=suma+sueldos[f][c];
        }
        sueldostot[f] = suma;
    }
}

void imprimirTotalPagado(char empleados[CANTEMPLEADOS][40],float sueldostot[CANTEMPLEADOS])
{
    int f;
    printf("Total de sueldos pagados por empleado.\n");
    for(f=0;f<CANTEMPLEADOS;f++)
    {
        printf("%s - %0.2f\n",empleados[f],sueldostot[f]);
    }
}

void empleadoMayorSueldo(char empleados[CANTEMPLEADOS][40],float sueldostot[CANTEMPLEADOS])
{
    int f;
    float may=sueldostot[0];
    char nom[40];
    strcpy(nom,empleados[0]);
    for(f=0;f<CANTEMPLEADOS;f++)
    {
        if (sueldostot[f]>may)
        {
            may=sueldostot[f];
            strcpy(nom,empleados[f]);
        }
    }
    printf("El empleado con mayor sueldo es %s que tiene un sueldo acumulado de %0.2f",nom,may);
}


int main()
{
    char empleados[CANTEMPLEADOS][40];
    float sueldos[CANTEMPLEADOS][MESES];
    float sueldostot[CANTEMPLEADOS];
    cargar(empleados,sueldos);
    calcularSumaSueldos(sueldos,sueldostot);
    imprimirTotalPagado(empleados,sueldostot);
    empleadoMayorSueldo(empleados,sueldostot);
    getch();
    return 0;
}


Retornar