Duvidas no codigo de funçoes - champion87 - 26-11-2010 19:20
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
RE: Duvidas no codigo de funçoes - Corvus - 27-11-2010 01:21
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.
RE: Duvidas no codigo de funçoes - champion87 - 27-11-2010 04:01
e como eu faço isso do array de estruturas?
eu neste trabalho nao posso usar apontadores...
RE: Duvidas no codigo de funçoes - Corvus - 27-11-2010 12:15
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
RE: Duvidas no codigo de funçoes - champion87 - 27-11-2010 18:29
obrigado corvus foi uma ajuda excelente.
RE: Duvidas no codigo de funçoes - champion87 - 28-11-2010 03:39
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");
}
RE: Duvidas no codigo de funçoes - Corvus - 28-11-2010 13:24
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)
RE: Duvidas no codigo de funçoes - champion87 - 28-11-2010 13:35
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");
}
}
RE: Duvidas no codigo de funçoes - Corvus - 28-11-2010 14:21
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.)
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.
RE: Duvidas no codigo de funçoes - champion87 - 28-11-2010 15:13
ja experimentei de tudo nao estou mesmo a ver.
podes dar-me so uma dica para eu me orientar?
|