Forum Pplware

Versão Completa: Duvidas no codigo de funçoes
Está de momento a ver uma versão reduzida do nosso conteúdo. Ver versão completa com o formato adequado.
Páginas: 1 2
oi pessoal.

estou com um pequeno problema tenho de criar um programa de gestao de um parque de estacionamento e estou empancado na funçao saida do meu codigo que deve consistir o programa pedir o lugar onde esta a viatura para depois aparecer os dados dela e poder ser apagada do programa pelo utilizador.

aqui esta o meu codigo: (peço desculpa pela confusão.. a funçao é saida)
Código:
#include <stdio.h>
#include <stdlib.h>


struct Data{
        int mes;
        int ano;
        int dia;
        }data;


struct Gestao{
        char matricula[10];
        int lugar;
        int classe;
        int horaEntrada;
        int horaSaida;
        struct Data data;
        }gestao;


void entrada(struct Gestao gestao, struct Data data)
{
       int l;
       int n;
       printf("\nQuantas viaturas pertende inserir:");
       scanf("%d", &n);
       for(l=1;l<=n;l++){
       gestao.lugar=l;
       printf("\n\n\tO carro ficara no lugar %d", gestao.lugar);
       printf("\n\n\n\tIntroduza a matricula do veiculo (separada por -): ");
       scanf("%s", gestao.matricula);
       printf("\n\n\tIntroduza a classe do veiculo: ");
       scanf("%d", &gestao.classe);
       printf("\n\n\tIntroduza o ano corrente: ");
       scanf("%d", &gestao.data.ano);
       printf("\n\n\tIntroduza o mes corrente: ");
       scanf("%d", &gestao.data.mes);
       printf("\n\n\tIntroduza o dia corrente: ");
       scanf("%d", &gestao.data.dia);
       printf("\n\n\tIntroduza a hora de entrada (hora.minutos): ");
       scanf("%f", &gestao.horaEntrada);
       system("cls");
       }


}


void saida(struct Gestao gestao)
{
       printf("\n\tIntroduza o lugar onde esta o veiculo: ");
       scanf("%d", gestao.lugar);
       printf("\n\n\tIntroduza a hora de saida (hora.minutos): ");
       scanf("%f", &gestao.horaSaida);
}


void o_meu_menu(){
     printf("\n\n\t _____GESTAO PARQUE ESTACIONAMENTO______\n");//menu inicial depois coloca-se outro menu mais avançado
     printf("\t|                                       |\n");
     printf("\t|     1--  Registar Entrada             |\n");
     printf("\t|     2--  Registar saidas              |\n");
     printf("\t|     3--  Pesquisas avancadas          |\n");
     printf("\t|     0--  Sair                         |\n");
     printf("\t|_______________________________________|\n\n");
     printf("\tEscolha a opcao: ");
       }


void sub_menu(){
     printf("\n _______________________________PESQUISA AVANCADA_____________________________");
     printf("\n|                                                                             |");
     printf("\n|       1-- Exibir carros em parque                                           |");
     printf("\n|_____________________________________________________________________________​|");
     printf("\n|                                                                             |");
     printf("\n|  \x5 Estacionamentos:                                                         |");
     printf("\n|                                                                             |");
     printf("\n|       2--  Efectuados a partir de uma dada data                             |");
     printf("\n|                                                                             |");
     printf("\n|       3--  Efectuados entre duas dadas datas                                |");
     printf("\n|                                                                             |");
     printf("\n|       4--  Efectuados para uma dada classe de veiculos                      |");
     printf("\n|                                                                             |");
     printf("\n|       5--  Efectuados por classe a partir de uma dada data                  |");
     printf("\n|                                                                             |");
     printf("\n|       6--  Efectuados por classe entre duas dadas datas                     |");
     printf("\n|_____________________________________________________________________________​|");
     printf("\n|                                                                             |");
     printf("\n|  \x5 Montantes Apurados:                                                      |");
     printf("\n|                                                                             |");
     printf("\n|       7--  Tendo em conta todos os estacionamentos efectuados               |");
     printf("\n|                                                                             |");
     printf("\n|       8--  Num dado mes                                                     |");
     printf("\n|                                                                             |");
     printf("\n|       9--  Num dado ano                                                     |");
     printf("\n|                                                                             |");
     printf("\n|       10- Todos os dados relativos a uma determinada viatura                |");
     printf("\n|                                                                             |");
     printf("\n|_____________________________________________________________________________​|");
     printf("\n|                                                                             |");
     printf("\n|       11- Sair                                                              |");
     printf("\n|_____________________________________________________________________________​|\n");
     printf("\nEscolha a opcao: ");
}



login(char user[10],char checkuser[10], char pass[10], char checkpass[10],int i, int j, int op){
    while(i<3){
        printf("\n\t\t\t_______________LOGIN______________");
        printf("\n\n\t\t\tUsername: ");
        gets(user);
        printf("\n\n\t\t\tPassword: ");
        gets(pass);
        if(strcmp(user,checkuser)==0 && strcmp(pass,checkpass)==0){
            system("cls");
            while(op!='0'){
                o_meu_menu();
                op=getch();
                system("cls");
                switch(op){
                    case '1':
                            entrada(gestao,data);
                            break;
                    case '2':
                            saida(gestao);
                            break;
                    case '3':
                            sub_menu();
                            break;
                    case '0':
                            printf("\n\n\t _________________________________\n");
                            printf("\t|                                 |\n");
                            printf("\t|     Prima Enter Para Sair       |\n");
                            printf("\t|_________________________________|\n\n\n\n");
                            break;
                    default:
                            puts("\n\n\t _________OPCAO INVALIDA_________\n");
                            puts("\t|    Prima Enter Para Voltar     |\n");
                            puts("\t|________________________________|\n\n\n");
                            getch();
                            system("cls");
                }
            }
            i=3;
            }else if(strcmp(user,checkuser)==1 || strcmp(pass,checkpass)==1){
                   system("cls");

                   i++;
                   printf("\n\n\t\t\t   YOU HAVE %d MORE PPORTUNITIES\n", j);
                   j--;
           }

       }
}

int main()
{
    char sair[4]={"sair"};
    char checky[1]=("y");
    char checkn[1]=("n");
    int op2;
    int op;
    int i=0;
    int j=2;
    char user[10];
    char checkuser[10]=("1234");
    char pass[10];
    char checkpass[10]=("1234");
    struct Data data;
    struct Gestao gestao;
    login(user,checkuser,pass,checkpass,i,j,op);

}
se alguem me poder ajudar agradecia bastante
Boas

Para já, vejo um problema que não me apercebi no outro post: da maneira que tens isso, apenas guardas os dados de uma viatura, escrevendo por cima dos dados da viatura anterior. Precisas de ter ou um array com um número pré-definido de posições ou então alocar dinamicamente o array quando souberes quantas viaturas querem introduzir.

Não sei se já estudaste ponteiros, mas pelo que me dá a entender, parece-me que seria mais simples para já usares um array global de struct Gestao, com um número máximo de posições e não deixares inserir mais que esse número de viaturas. Nesse array, cada indice corresponderia ao lugar da viatura (a começar por 0, como é obvio). Claro que terias de alterar as funções já existentes para trabalharem com o array.
e como eu faço isso do array de estruturas?
eu neste trabalho nao posso usar apontadores...
Se já trabalhaste com arrays, é um array como qualquer outro, apenas muda o tipo.

Para declarares o array basta-te:

Código:
#define MAX_VIATURAS 100

struct Gestao gestao[MAX_VIATURAS];

(o 100 é apenas um exemplo, tu é que tens de ver que valor será melhor no teu caso).

Assim ficas com um array de 100 posições, desde gestao[0] a gestao[99].

A maneira de aceder aos membros de cada posição continua a ser o mesmo, atraves de .

Código:
gestao[5].classe = 1;

Deixo-te aqui um link que te pode ajudar a melhorar os conhecimentos de C (em inglês):
Teach Yourself C in 24 hours. Não te torna um especialista, mas deve ajudar a entender melhor as coisas Wink
obrigado corvus foi uma ajuda excelente.
o que estou a tentar fazer e imprimir dados de veiculos estacionados entre duas datas mas nao estou a conseguir o resultado pretendido. alguem me pode dizer o que fazer á seguinte funçao:

Código:

Código:
void datedate(struct Gestao gestao[SIZE], struct Data data)
{
   int l;
   int year;
   int month;
   int day;
   int year1;
   int month1;
   int day1;
   system("cls");
   printf("\n\n\tIntroduza as datas entre as quais pretende pesquisar.\n");
   printf("\n\t\tIntroduza o ano de inicio: ");
   scanf("%d", &year);
   printf("\n\t\tIntroduza o mes de inicio: ");
   scanf("%d", &month);
   printf("\n\t\tIntroduza o dia de inicio: ");
   scanf("%d", &day);
   printf("\n\t\tIntroduza o ano de fim: ");
   scanf("%d", &year1);
   printf("\n\t\tIntroduza o mes de fim: ");
   scanf("%d", &month1);
   printf("\n\t\tIntroduza o dia de fim: ");
   scanf("%d", &day1);
   for(l=0;l<SIZE;l++){
       if(year<=gestao[l].data.ano && year1>=gestao[l].data.ano){
            if(month<=gestao[l].data.mes || month1>=gestao[l].data.mes){
                if(day<=gestao[l].data.dia || day1>=gestao[l].data.dia){
                    printf("\t_________________________________________");
                    printf("\n\n\tLugar: %d", gestao[l].lugar);
                    printf("\n\n\tMatricula: %s", gestao[l].matricula);
                    printf("\n\n\tClasee: %d", gestao[l].classe);
                    printf("\n\n\tdata: %d / %d / %d", gestao[l].data.dia, gestao[l].data.mes, gestao[l].data.ano);
                    printf("\n\n\tHora de Entrada: %.2fH", gestao[l].horaEntrada);
                    printf("\n\n\t_________________________________________\n");
                }
           }
       }
   }
   getch();
   system("cls");
}
A tua lógica para a função está correcta, no entanto tens uns errozitos:

1 - A declaração da função está errada. Quando queres passar um array como parametro, não indicas o tamanho entre [], envias como parametro extra:

Código:
void datedate(struct Gestao gestao[], int tamanho, struct Data data);


2 - A comparação das datas não está correcta também. Da maneira que comparas, basta o mês final (ou o dia final) ser inferior ao mês / dia inicial e o teste retorna sempre falso (Por exemplo de 2010-11-28 a 2011-02-05)

Tens de comparar os anos. Só no caso do ano do registo ser igual ao ano inicial é q vais comparar o mês do registo com o mês inicial e só no caso do mês do registo ser igual ao mês inicial é q vais comparar o dia. Fazes o mesmo para o ano final.

Espero que esta última parte não tenha ficado muito confusa, mas queria apontar-te na direção sem te dar exactamente a resposta, para te fazer pensar em como o fazer (o que só ajuda a melhorar as capacidades de programação) Wink
eu esta madrugada fiz isto nao e a mesma funçao esta tem de pesquisar a partir de uma data:

Código:
void date(struct Gestao gestao[SIZE], struct Data data)
{
   int l;
   int year;
   int month;
   int day;
   system("cls");
   printf("\n\n\tIntroduza a data a partir da qual pretende pesquisar.\n");
   printf("\n\t\tIntroduza o ano: ");
   scanf("%d", &year);
   printf("\n\t\tIntroduza o mes: ");
   scanf("%d", &month);
   printf("\n\t\tIntroduza o dia: ");
   scanf("%d", &day);
   for(l=0;l<SIZE;l++){
       if(year<=gestao[l].data.ano){
           if(year==gestao[l].data.ano){
                if(month<=gestao[l].data.mes){
                    if(day<=gestao[l].data.dia || day>=gestao[l].data.dia){
                        printf("\t_________________________________________");
                        printf("\n\n\tLugar: %d", gestao[l].lugar);
                        printf("\n\n\tMatricula: %s", gestao[l].matricula);
                        printf("\n\n\tClasse: %d", gestao[l].classe);
                        printf("\n\n\tdata: %d / %d / %d", gestao[l].data.dia, gestao[l].data.mes, gestao[l].data.ano);
                        printf("\n\n\tHora de Entrada: %.2fH", gestao[l].horaEntrada);
                        printf("\n\n\t_________________________________________\n");
                    }
               }

           }else{
                if(month<=gestao[l].data.mes || month>=gestao[l].data.mes){
                        if(day<=gestao[l].data.dia || day>=gestao[l].data.dia){
                             printf("\t_________________________________________");
                             printf("\n\n\tLugar: %d", gestao[l].lugar);
                             printf("\n\n\tMatricula: %s", gestao[l].matricula);
                             printf("\n\n\tClasse: %d", gestao[l].classe);
                             printf("\n\n\tdata: %d / %d / %d", gestao[l].data.dia, gestao[l].data.mes, gestao[l].data.ano);
                             printf("\n\n\tHora de Entrada: %.2fH", gestao[l].horaEntrada);
                             printf("\n\n\t_________________________________________\n");
               }
          }
       }
     }
   }
   getch();
   system("cls");
}

eu tambem pensei nisto:

Código:
for ( l = 0; l < SIZE; l++ )
    {
        if ( ( gestao[l].data.ano >= year && gestao[l].data.mes >= month && gestao[l].data.dia >= day ) &&
           ( gestao[l].data.ano <= year1 && gestao[l].data.mes <= month1 && gestao[l].data.dia <= day1 ) )
        {
            printf("\t_________________________________________");
            printf("\n\n\tLugar: %d", gestao[l].lugar);
            printf("\n\n\tMatricula: %s", gestao[l].matricula);
            printf("\n\n\tClasee: %d", gestao[l].classe);
            printf("\n\n\tdata: %d / %d / %d", gestao[l].data.dia, gestao[l].data.mes, gestao[l].data.ano);
            printf("\n\n\tHora de Entrada: %.2fH", gestao[l].horaEntrada);
            printf("\n\n\t_________________________________________\n");
        }
    }
Na função date() tens o mesmo problema que te referi à pouco: não se indica o tamanho do array na declaração da função, passa-se como parametro extra. Por acaso está a funcionar pq depois no código usas o #define que define o tamanho do array (SIZE).

Além disso, a comparação de datas na função date() também não está correcta. Por um lado,

day <= gestao[l].data.dia || day >= gestao[l].data.dia

é o mesmo que

day == gestao[l].data.dia

Por outro, estás a comparar mal o mês. Aceitas datas com o mês indicado e também os meses anteriores (Se o utilizador pedir info para a data 2010-11-28, o programa tb mostra 2010-10-28, 2010-09-28, etc, etc, etc.) Wink

Quanto à função de que se falou no outro post, lamento informar-te mas conseguiste organizar exactamente a mesma comparação de outra forma. A forma actual e a anterior são equivalentes e dão o mesmo resultado.
ja experimentei de tudo nao estou mesmo a ver.

podes dar-me so uma dica para eu me orientar?
Páginas: 1 2
URL's de Referência