如何在函数中使用指针结构?

时间:2018-05-11 17:33:26

标签: c

  #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()上的代码来处理这个特定结构的变量呢?

2 个答案:

答案 0 :(得分:1)

如果要使用指针使用访问struct字段 - &gt;操作者:

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;

答案 1 :(得分:1)

在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;
}

我并不熟悉你的变量和函数所使用的语言。但是这里有一个完整的英语示例,这应该展示概念。

#include <stdio.h>
struct A {
  int b;
  int c;
};
void printer(struct A* a_struct){
  printf("%d %d\n", a_struct->b, a_struct->c);
}

int main(void) {
  struct A arr[10];
  for (int i = 0; i < 10; i++){
    arr[i].b = i;
    arr[i].c = i;
  }
  printer(&arr[3]);
  return 0;
}