/* * funcao que trata dos baloes menu baloes * Variaveis de entrada * opcao - numero inteiro * baloes - baloesStruct em vetor * contador - contadorStruct por referência */ void menuBaloes(int opcao, baloesStruct baloes[], contadorStruct *contador){ int posicao=-1; char letra; switch(opcao){ case 1: //inserir baloes no vetor inserirBaloes(baloes, contador); break; case 2: //consultar dados dos baloes do{ printf("\n\n\n#############################################################\n"); printf("#_______________ MENU BALOES -> Consultas _______________#\n"); printf("#_______________ 1 - Ver todos os baloes _______________#\n"); printf("#_______________ 2 - Escolher Balao _______________#\n"); printf("#_______________ 3 - Ver Baloes por posicao _______________#\n"); printf("#_______________ 0 - Sair _______________#\n"); printf("#############################################################\n"); printf("Escolha uma opcao: "); opcao = lerNumero(0,3); switch(opcao){ case 1: //consultar dados de todos os baloes consultarBaloes(baloes, contador->nrBaloes, '\0'); //passa o argumento \0 porque não quer filtrar pela posicao break; case 2: //mostra a informacao de um balao posicao = loopPesquisaBalaoValido(baloes, *contador); infoBaloes(baloes[posicao]); break; case 3: //consultar baloes por local A, B, C letra = loopPedirPosicao("Ver Baloes nas Posicoes A, B ou C\n Escolha uma opcao:"); consultarBaloes(baloes, contador->nrBaloes, letra);//passa o argumento letra para filtrar as posicoes do balao break; } }while(opcao!=0); /**fim consultar dados dos baloes**/ break; case 3: //alterar dados dos baloes alterarDadosBalao(baloes, contador); break; case 4: //Eliminar Balao printf("Insira o numero do balao que pretende Eliminar:\n"); opcao = lerNumero(1,MAXIMO_BALOES); posicao = procurarNumeroBalao(baloes, opcao, contador->nrBaloes); if(posicao!=-1){ eliminarBaloes(baloes, contador, posicao); }else{ printf("O numero do balao nao foi encontrado!\n"); } break; } }
/*pede a data em até que seja uma data correcta * Variaveis de entrada * baloes - Estrutura dos baloes * devolve a estrutura baloes */ dataFabricoStruct loopDataBalao(dataFabricoStruct data){ do{ printf("Data do Balao\n Insira o dia:\n"); data.dia = lerNumero(1,31); printf("Insira o mes:\n"); data.mes = lerNumero(1, 12); printf("Insira o ano:\n"); data.ano = lerNumero(DATA_MINIMA, ANO); }while(validarData(data.dia, data.mes, data.ano)==0); return data; }
void main(){ int num = 0; unsigned int opcao; unsigned int total = 0; setlocale(LC_ALL, "Portuguese"); //system("clear"); // limpa console, util para Linux lerNumero(&num); do{ imprimeMenu(&opcao); switch(opcao){ case 1: total = calcularFatorial(num); printf("Fatorial: %d \n", total); break; case 2: total = calcularSomatorio(num); printf("Somatório: %d \n", total); break; default: printf("Opção inválida. \n"); break; } } while(opcao < 1 || opcao > 2); }
void lerNumero(int *num){ printf("Digite um número positivo inteiro: "); scanf("%d", num); if(*num <= 0){ lerNumero(num); } }
/* * funcao para inserir os baloes no vetor baloesStruct * baloes - baloesStruct em vetor * contador - contadorStruct por referência */ void inserirBaloes(baloesStruct baloes[], contadorStruct *contador){ int numero; int novaposicao=contador->nrBaloes; if(contador->nrBaloes<MAXIMO_BALOES){ //numero do balao numero = loopPesquisaBalaoinValido(baloes, contador->nrBaloes); baloes[novaposicao].numero=numero; //designacao printf("Insira a designacao do balao:\n"); lerString(baloes[novaposicao].designacao, MAX_DESIGNACAO); baloes[novaposicao].data=loopDataBalao(baloes[novaposicao].data); //Lotacao maxima do balao printf("Insira a lotacao maxima MAX ate %d\n", LOTACAOMAXIMA); baloes[novaposicao].lotacaoMaxima = lerNumero(LOTACAOMINIMA, LOTACAOMAXIMA); //posicao do balao baloes[novaposicao].localInicio = loopPedirPosicao("Insira a sua posicao A, B ou C:\n"); baloes[novaposicao].localFinal='\0'; baloes[novaposicao].bilhetes=NULL; baloes[novaposicao].nrBilhetes=0; baloes[novaposicao].numeroPessoasTransportadas=0; baloes[novaposicao].Totalviagens=0; baloes[novaposicao].nrTuristasNobalao=0; infoBaloes(baloes[novaposicao]); printf("Balao inserido com sucesso!\n"); contador->nrBaloes++; }else{ printf("O maximo de baloes suportado e: %d\n Nao e possivel inserir mais baloes!", MAXIMO_BALOES); } }
/* Alterar dados do balao * Variaveis de entrada * baloes - baloesStruct em vetor * contador - contadorStruct por referência */ void alterarDadosBalao(baloesStruct baloes[], contadorStruct *contador){ int opcao, posicao=-1; printf("\n\n ALTERACAO DE DADOS NOS BALOES! \n \n"); posicao = loopPesquisaBalaoValido(baloes, *contador); infoBaloes(baloes[posicao]); //mostra a info do balao do{ printf("\n\n\n#############################################################\n"); printf("#_______________ MENU BALAO -> Alterar Balao %d _________#\n", baloes[posicao].numero); printf("#_______________ 1 - Alterar Tudo _________#\n"); printf("#_______________ 2 - Alterar Designacao _________#\n"); printf("#_______________ 3 - Alterar data _________#\n"); printf("#_______________ 4 - Alterar lotacao maxima _________#\n"); printf("#_______________ 5 - Alterar posicao inicial _________#\n"); printf("#_______________ 0 - Sair _________#\n"); printf("#############################################################\n"); printf("Escolha uma opcao: "); opcao = lerNumero(0,5); switch(opcao){ case 1: //alterar tudo //elimina e cria um novo balao if(eliminarBaloes(baloes, contador, posicao)==1){ inserirBaloes(baloes, contador); } break; case 2: //alterar a designcao printf("Insira a nova designacao:\n"); lerString(baloes[posicao].designacao, MAX_DESIGNACAO); infoBaloes(baloes[posicao]); break; case 3://alterar a data baloes[posicao].data=loopDataBalao(baloes[posicao].data); infoBaloes(baloes[posicao]); break; case 4://alterar a lotacao maxima printf("Insira a nova lotacao maxima:\n"); baloes[posicao].lotacaoMaxima = lerNumero(LOTACAOMINIMA, LOTACAOMAXIMA); infoBaloes(baloes[posicao]); break; case 5: //alterar a localizaçao baloes[posicao].localInicio = loopPedirPosicao("Insira a sua posicao A, B ou C:\n"); //baloes[posicao] = pedirPosicaoBalao(baloes[posicao]); infoBaloes(baloes[posicao]); break; } }while(opcao!=0); }
//loop pesquisar balao valido return numero valido int loopPesquisaBalaoinValido(baloesStruct baloes[], int nrBaloes){ //pede um numero ao utilizador ate encontrar um numero sem balao associado int opcao, posicao=-1; printf("Insira o numero do balao:"); do{ opcao = lerNumero(MINIMO_BALOES, MAXIMO_BALOES); posicao = procurarNumeroBalao(baloes, opcao, nrBaloes); if(posicao!=-1){ printf("O numero ja se encontra a ser utilizado\n Insira o numero do balao:"); } }while(posicao!=-1); return opcao; }
//loop pesquisar balao valido return posicao no vector int loopPesquisaBalaoValido(baloesStruct baloes[], contadorStruct contador){ //pede um numero ao utilizador ate encontrar um balao valido e devolve a posicao int opcao, posicao=-1; printf("Insira o numero do balao:"); do{ opcao = lerNumero(MINIMO_BALOES, MAXIMO_BALOES); posicao = procurarNumeroBalao(baloes, opcao, contador.nrBaloes); if(posicao==-1){ printf("O numero do balao nao foi encontrado\n Insira o numero do balao:"); } }while(posicao==-1); return posicao; }
//menu principal int menu(contadorStruct contador){ int opcao; printf("|--------------------MENU-----------------------------------|\n"); printf(" Receita Obtida: %.2f \t Baloes Existentes: %d\n", contador.receita, contador.nrBaloes); printf(" Viagens Realizadas: %d \t Passageiros Transportados: %d\n", contador.viagensRealizadas, contador.passageirosTransportados); printf(" Passageiros em Lista de Espera: %d\n", contador.pListaEspera); printf("|-----------------------------------------------------------|\n"); printf("#############################################################\n"); printf("#_______________ 1-BALOES ___________#\n"); printf("#_______________ 2-VIAGENS ___________#\n"); printf("#_______________ 3-BILHETES ___________#\n"); printf("#_______________ 4-REGISTAR VIAGEM DO BALÃO ___________#\n"); printf("#_______________ 5-Consultar dados Estatisticos ___________#\n"); printf("#_______________ 6-Alterar Preco da viagem ___________#\n"); printf("#_______________ 0-Sair ___________#\n"); printf("#############################################################\n"); printf("Escolha uma opcao: "); opcao = lerNumero(0, 6); return opcao; }
void menuBilhetes(int opcao,contadorStruct *contador, listaEsperaStruct lista[]){ int submenu=1; switch(opcao){//comprar bilhetes case 1: comprarBilhetes(contador, lista); break; case 2://ler bilhetes do{ printf("\n\n\n#############################################################\n"); printf("#_______________ MENU BILHETES -> Consultas _______________#\n"); printf("#_______________ 1 - Ver todos os bilhetes _______________#\n"); printf("#_______________ 2 - Ver Bilhetes do ponto de origem _______#\n"); printf("#_______________ 3 - Ver Bilhetes do ponto de destino ______#\n"); printf("#_______________ 0 - Sair _______________#\n"); printf("#############################################################\n"); submenu = lerNumero(0, 3); mostrarBilhetesFiltro(submenu, lista); }while(submenu!=0); //mostrar todos os bilhetes break; } }
//compra bilhetes e adiciona automaticamente na sua lista de espera void comprarBilhetes(contadorStruct *contador, listaEsperaStruct lista[]){ int nrPessoas=0, i=0; bilhetesStruct bilhetesTemp; bilhetesStruct *bilhetesAUX; float totalBilheteIndividual =0; //pede o numero de pessoas ao utilizador para verificar se o bilhete +e idividual ou de grupo printf("Insira o numero de pessoas: "); nrPessoas = lerNumero(1, LOTACAOMAXIMA); bilhetesTemp.nrPessoas = nrPessoas; bilhetesTemp.preco=0; contador->pListaEspera +=nrPessoas; //pede a origem e o destino do balao bilhetesTemp.origem = loopPedirPosicao("Insira a sua posicao?\n"); bilhetesTemp.destino = loopPedirPosicao("Insira o destino?\n"); //bilhete em grupo if(nrPessoas>1){ printf("Insira o nome do grupo: "); lerString(bilhetesTemp.nome, MAX_NOME); bilhetesTemp.grupo = GRUPO; for(i=0; i<nrPessoas; i++){ bilhetesTemp.preco += contador->preco; } bilhetesTemp.preco = totalaPagar(bilhetesTemp.preco*nrViagens(bilhetesTemp.origem, bilhetesTemp.destino), DESCONTO); //preco*nr de viagens //mostra o total do preco dos bilhetes printf("Total de todos os bilhetes: %.2f\n", bilhetesTemp.preco); contador->receita+=bilhetesTemp.preco; //preco individual totalBilheteIndividual = totalaPagar(contador->preco*nrViagens(bilhetesTemp.origem, bilhetesTemp.destino), DESCONTO); //mostra o total do preco por pessoa printf("Preco por pessoa: %.2f\n", totalBilheteIndividual); }else{ //bilhete individual bilhetesTemp.grupo = SEM_GRUPO; bilhetesTemp.preco = totalaPagar(contador->preco*nrViagens(bilhetesTemp.origem, bilhetesTemp.destino), SEM_DESCONTO); contador->receita+=bilhetesTemp.preco; printf("Total a pagar e: %.2f\n", bilhetesTemp.preco); } switch(bilhetesTemp.origem){ case 'A': lista[POS_A].nrBilhetes+=1; contador->destinoA+=1; bilhetesAUX = realloc(lista[POS_A].bilhetes,lista[POS_A].nrBilhetes*sizeof(bilhetesStruct)); if(bilhetesAUX!=NULL) { lista[POS_A].bilhetes = bilhetesAUX; lista[POS_A].bilhetes[lista[POS_A].nrBilhetes-1] = bilhetesTemp; }else{ printf("Ocorreu um erro na memoria"); } break; case 'B': lista[POS_B].nrBilhetes+=1; contador->destinoB+=1; bilhetesAUX = realloc(lista[POS_B].bilhetes,lista[POS_B].nrBilhetes*sizeof(bilhetesStruct)); if(bilhetesAUX!=NULL) { lista[POS_B].bilhetes = bilhetesAUX; lista[POS_B].bilhetes[lista[POS_B].nrBilhetes-1] = bilhetesTemp; }else{ printf("Ocorreu um erro na memoria"); } break; case 'C': lista[POS_C].nrBilhetes+=1; contador->destinoC+=1; bilhetesAUX = realloc(lista[POS_C].bilhetes,lista[POS_C].nrBilhetes*sizeof(bilhetesStruct)); if(bilhetesAUX!=NULL) { lista[POS_C].bilhetes = bilhetesAUX; lista[POS_C].bilhetes[lista[POS_C].nrBilhetes-1] = bilhetesTemp; }else{ printf("Ocorreu um erro na memoria"); } break; } }
/***MENUS***/ int main(void){ /**declaração de variavies**/ contadorStruct contador; baloesStruct baloes[MAXIMO_BALOES]; listaEsperaStruct lista[MAX_LISTA]; viagensStruct *viagens=NULL; int opcao=0, submenu=0; //os ponteiros são iniciados a null para que se possa usar o malloc para fazer a gestão da memória dinâmica limparLista(lista, NAO_LIMPAR_MEMORIA); //leitura do ficheiro binario viagens = lerRegistosFicheiroBinario(&contador, baloes, lista, viagens); do{ opcao = menu(contador);//chama o menu principal que retorna a opcao escolhida switch(opcao){ case 0: gravarRegistos(&contador, baloes, lista, viagens); //gravar as alteracoes no ficheiro binario break; case 1://menu baloes do{ printf("\n\n\n#############################################################\n"); printf("#_______________ MENU BALOES _______________#\n"); printf("#_______________ 1 - Inserir dados Baloes _______________#\n"); printf("#_______________ 2 - Consultar dados Baloes _______________#\n"); printf("#_______________ 3 - Alterar dados Baloes _______________#\n"); printf("#_______________ 4 - Eliminar Baloes _______________#\n"); printf("#_______________ 0 - Voltar ao menu principal_______________#\n"); printf("#############################################################\n"); printf("Escolha uma opcao: "); submenu = lerNumero(0, 4); menuBaloes(submenu, baloes, &contador); //chama a funcao que trata dos baloes e contadores }while(submenu!=0); break; case 2://menu viagens do{ printf("\n\n\n#############################################################\n"); printf("#_______________ MENU Viagens _______________#\n"); printf("#_______________ 1 - Inserir Viagens _______________#\n"); printf("#_______________ 2 - Consultar Viagens _______________#\n"); printf("#_______________ 0 - Voltar ao menu principal_______________#\n"); printf("#############################################################\n"); printf("Escolha uma opcao: "); submenu = lerNumero(0, 2); switch(submenu){ case 1: viagens = inserirViagem(baloes, viagens, &contador, lista); break; case 2: infoViagens(viagens, contador); break; } }while(submenu!=0); break; case 3: //menu bilhetes do{ printf("\n\n\n#############################################################\n"); printf("#_______________ MENU Bilhetes _______________#\n"); printf("#_______________ 1 - Vender Bilhetes _______________#\n"); printf("#_______________ 2 - Consultar Bilhetes _______________#\n"); printf("#_______________ 0 - Voltar ao menu principal_______________#\n"); printf("#############################################################\n"); printf("Escolha uma opcao: "); submenu = lerNumero(0, 2); menuBilhetes(submenu, &contador, lista); }while(submenu!=0); break; case 4: //Movimentar Baloes movimentarBaloes(baloes, &contador); break; case 5: //consultar dados estatisticos do{ printf("\n\n\n#############################################################\n"); printf("#_______ MENU Estatisticas ___#\n"); printf("#_______ 1 - Total viagens por cada balao ___#\n"); printf("#_______ 2 - Media de turistas transportados por balao ___#\n"); printf("#_______ 3 - Balao(oes) com mais viagens _______________#\n"); printf("#_______ 4 - Percentagem de turistas por destino _________#\n"); printf("#_______ 5 - Informacoes dos bilhetes _________#\n"); printf("#_______ 0 - Voltar ao menu principal _______________#\n"); printf("#############################################################\n"); printf("Escolha uma opcao: "); submenu = lerNumero(0,5); dadosEstatisticos(submenu, baloes, viagens, contador, lista); }while(submenu!=0); break; case 6: alterarPrecoBilhete(&contador); break; } }while(opcao!=0); limparLista(lista, LIMPAR_MEMORIA); free(viagens); viagens = NULL; return 0; }