首页 > 解决方案 > 如何在函数中使用指针结构?

问题描述

  #include <stdio.h>

struct bilhete{
    int horarioEntrada;
    int horarioSaida;
    int preco;
    int minEntrada;
    int minSaida;
    int horaSaida;
    int horaEntrada;
};

void extrairHoraMin(struct bilhete *a){ ///////////HERE
    a.minEntrada = a.horarioEntrada%100;
    a.horaEntrada = a.horarioEntrada/100;
    a.minSaida = a.horarioSaida%100;
    a.horaSaida = a.horarioSaida/100;
}

int obterIntervalo(struct bilhete a){
    int b = a.horaEntrada*60+a.minEntrada;
    int c = a.horaSaida*60+a.minSaida;
    return c-b;
}

int obterValorEstacionamento(int a){
    if(a<=15){return 0;}
    else if(a>15&&a<=60){return a*30;}
    else if(a>60&&a<=120){return 60*30+(a-60)*20;}
    else {return 60*30+60*20+(a-120)*10;}
}

int main()
{
    struct bilhete bilhetes[100];
    int contaCentavos, intervalo, receita=0;
    int contadorCarros=0, i, total=0;

    scanf("%d", &bilhetes[contadorCarros].horarioEntrada);
    while (bilhetes[contadorCarros].horarioEntrada>=0)
    {
        do
        {
            scanf("%d", &bilhetes[contadorCarros].horarioSaida);
        }
        while(bilhetes[contadorCarros].horarioSaida < bilhetes[contadorCarros].horarioEntrada);

        extrairHoraMin(&bilhetes[contadorCarros]);  ///////////AND HERE TOO
        intervalo = obterIntervalo(bilhetes[contadorCarros]);
        contaCentavos = obterValorEstacionamento(intervalo);
        bilhetes[contadorCarros].preco = contaCentavos;
        printf("Entrada\n%02d:%02d\nSaida\n%02d:%02d\nDuracao(min)\n%d\nPreco(centavos)\n%d\n",bilhetes[contadorCarros].horaEntrada, bilhetes[contadorCarros].minEntrada, bilhetes[contadorCarros].horaSaida, bilhetes[contadorCarros].minSaida,intervalo, bilhetes[contadorCarros].preco);
        total += contaCentavos;
        contadorCarros++;
        scanf("%d", &bilhetes[contadorCarros].horarioEntrada);
    }

    printf("Faturamento total (centavos)\n%d\n", total);

    int inicioIntervalo, finalIntervalo;
    scanf("%d", &inicioIntervalo);
    do
    {
        scanf("%d", &finalIntervalo);
    }
    while (finalIntervalo  < inicioIntervalo);

    for (i = 0; i < contadorCarros ; i++)
    {
        if (bilhetes[i].horarioSaida>inicioIntervalo && bilhetes[i].horarioSaida< finalIntervalo)
        {
            receita += bilhetes[i].preco;
        }
    }

    printf("\nFaturamento no periodo (centavos)\n%d\n", receita);

    return 0;
}

我用“/////////HERE”标记了问题的相关部分。

我需要使函数 extrairHoraMin() 接收指向结构的指针,并允许我使用相关结构的元素并将值属性值分配给结构的其他变量。

不需要更改 main() 函数,那么如何仅通过更改 extrairHoraMin() 上的代码来处理这个特定结构的变量?

标签: c

解决方案


如果要使用指针访问结构字段,请使用 -> 运算符:

void extrairHoraMin(struct bilhete *a){ ///////////HERE
    a->minEntrada = a->horarioEntrada%100;
    a->horaEntrada = a->horarioEntrada/100;
    a->minSaida = a->horarioSaida%100;
    a->horaSaida = a->horarioSaida/100;
}

编译器应该给你警告又名:

t.c:14:6: error: member reference type 'struct bilhete *' is a pointer; did you mean to use '->'?
    a.minEntrada = a.horarioEntrada%100;

推荐阅读